特定の組織に属するユーザーのリスト、またはフランチャイジーのリストからフランチャイジーを取得するHQLクエリを作成しようとしていますが、休止状態では解析できません。理由がわかりません。 HQLは次のとおりです。
from User u where
(u.parentOrganisation = :topLevelOrganisation or u.parentOrganisation in :franchisees)
and u.parentOrganisation.deleted = false
and u.active = true
これは、休止状態が吐き出すエラーです。
unexpected AST node: {vector} [from com.myapp.User u where (u.parentOrganisation = :topLevelOrganisation or u.parentOrganisation in :franchisees0_, :franchisees
1_, :franchisees2_) and u.parentOrganisation.deleted = false and u.active = true]. Stacktrace follows:
Message: unexpected AST node: {vector} [from com.myapp.User u where (u.parentOrganisation = :topLevelOrganisation or u.parentOrganisation in :franchisees0_, :fr
anchisees1_, :franchisees2_) and u.parentOrganisation.deleted = false and u.active = true]
or u.parentOrganisation in :franchisees
ビットを取り出すと、クエリは次のようになります。
from User u where
(u.parentOrganisation = :topLevelOrganisation)
and u.parentOrganisation.deleted = false
and u.active = true
その後、正常に動作します。私の構文の何が問題になっていますか?なぜ休止状態はその余分な条項について不平を言っているのですか?
ああ、:franchisees
を括弧で囲む必要があることがわかりました。
from User u where
(u.parentOrganisation = :topLevelOrganisation or u.parentOrganisation in (:franchisees))
and u.parentOrganisation.deleted = false
and u.active = true
これが発生する理由は、配列内のデータが括弧なしでリストに配置されると、リストからデータベースを検索するためのクエリ構文が正しくなくなるためです。
例:
_List<Integer> userIdList = [0, 1, 2, 3]
_
括弧なしのクエリ:_from User u where u.id in :list
_
データが挿入されると、次のようになります_from User u where u.id in 0, 1, 2, 3
_ --WRONG SYNTAX。
括弧付きのクエリ:from User u where u.id in (:list)
データが挿入されると、次のようになりますfrom User u where u.id in (0, 1, 2, 3)
--CORRECT SYNTAX。
HQLの条件「OR」を2つのステートメントに分割できます。
それはうまくいきます。
from User u where
(u.parentOrganisation = :topLevelOrganisation and u.parentOrganisation.deleted = false
and u.active = true )
or (u.parentOrganisation in (:franchisees) and u.parentOrganisation.deleted = false
and u.active = true)