私のコードベースをGrails 2.1.0から3.2.0にアップグレードしました。しかし、クエリの1つが期待どおりに機能しないという状況に遭遇しました。Grails GORM 3.2.0 query with `where values in list`
public List<Location> findAllLocationsByNames(Collection<String> placeNames) {
return Location.executeQuery("select l from Location l where l.placeName in (:placeNames)", [placeNames: placeNames])
}
アップグレードする前に、このクエリは正常に機能していました。私はタイプLinkedKeySet
(HashMap.getKeySet()
)のコレクションを渡し、場所のリストを正しく返します。しかし、今のGrailsの新バージョンで、私はこのエラーを得た:
java.util.LinkedHashMap$LinkedKeySet cannot be cast to java.lang.String
私は少しGrailsの内部深く、GORM掘っとQueryTranslatorImplが[NAMED_PARAM] ParameterNode: '?' {name=placeNames, [email protected]}
としてSQL ASTに名前付きパラメータplaceNames
を翻訳することを見ましたが、私はなぜわかりません。最後に
where
を使用するために元のクエリを変更し、DetachedCriteriaを:
public List<Location> findAllLocationsByNames(Collection<String> placeNames) {
return Location.where {placeName in placeNames}.list()
}
この時間は、すべてが正常に動作し、返された結果は、私が期待したものでした。
executeQuery
を使用した最初のクエリの問題点は何ですか?
あなたがタイプ
java.util.List
ではなく、代わりに他のコレクション型(Set
など)のパラメータを指定した場合にHibernateの新しいバージョンがあまり寛大されているようです!正確に何が変わったのか知っていますか? –