web-dev-qa-db-ja.com

コレクションのサイズが0または空かどうかを確認するHQLクエリ

空のappoinmentコレクション(OneToManyによってマップされる)を持つユーザーを含むHQLクエリを生成しようとします。

_SELECT u FROM User u JOIN u.appointments uas WHERE u.status = 1 AND (uas.time.end < :date OR size(uas) = 0)
_

私はいくつかの方法でそれを試します(NOT EXIST ELEMENT(), IS NULL)も参照してください: NHibernate(HQL)でコレクションが空かどうかを確認する方法? (これは私には機能しません)

しかし、まだ表示したくない結果や、HQLまたはSQL SERVERのエラー

注:

jOINなしのクエリは機能します。

_"FROM User u WHERE u.status = 1 AND size(u.appointments) = 0"
_

解決済み

別のJOINが問題を解決しました:

_SELECT u FROM User u LEFT JOIN u.appointments pas1 LEFT JOIN pas1.slot t WHERE u.status = 1 AND t.end <= :date1 OR t.end IS NULL ORDER BY u.name asc
_
26
Michel

IS EMPTYの使用はうまくいくはずです(私はJPQL構文を支持します):

SELECT u FROM User u WHERE u.status = 1 AND u.appointments IS EMPTY

表示されない場合は、生成されたSQLを表示してください。

参考文献

  • Hibernate Coreリファレンスガイド
  • JPA 1.0仕様
    • 4.6.11項「空のコレクション比較式」
47
Pascal Thivent

生成されたSQLを確認しましたか?あなたの方法はここでうまくいきます:

// Hibernate query:
const string hql = "from User u where u.Id = 101 and size(u.Appointments) = 0";


// Generates this working SQL:
select user0_.Id    as Id20_,
       user0_.Name as Name2_20_
from   User user0_
where  user0_.Id = 101
       and (select count(appointment1_.Id_Solicitud)
            from   Appointment appointment1_
            where  user0_.Id = appointment1_.Id_User) = 0
13
rebelliard
// Hibernate query:
const string hql = "from User u where u.Id = 101 and size(u.Appointments) = 0";
6
fez