JPA用List入力@Queryでunexpected AST node:{vector}

1884 ワード

JPAクエリの問題に遭遇しました.私の元のJPA文はこうです.
@Query(value = " select s from SmsCountEntity  s where (?1 is null or s.areaType in (?1)) order by s.dateCreate desc ")
 Page findSmsCountPage( List areaList,Pageable pageable);

項目を見て他もこんな書き方をしていたのですが、やはり新聞を間違えて、ニャーニャー?科学的ではありませんね.
"message": "org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: {vector} [ select new com.dfl.ycp3.enquiry.dto.SmsCountDTO(s.shopCode,s.shortName,s.areaType) from com.dfl.ycp3.enquiry.entity.SmsCountEntity s where (:x4_0, :x4_1, :x4_2 is null or s.areaType in (:x4_0, :x4_1, :x4_2)) order by s.dateCreate desc , s.id desc];
明らかに私は大体参列したList areaList問題だと知っています.JPA文で参列したList areaListが空かどうかを判断するからです.1 is nullですが、加えてテストの時に間違えました.
ネットで検索すると、このようなエラーの原因は2つあります.
1つ目は、配列内のデータをリストに格納し、カッコがない場合、リストからデータベースを検索するためのクエリー構文がエラーになります.例:s.areaType in(?1)をs.areaType inと書く?1参入を括弧で囲んでいないため、文法の間違いがあります.
2つ目はcoalesceでnullを判断する例:where(coalesce(?1,null)is null or s.areaType in(?1))
ベクトルが空であればnullを生成できるからです.そうでない場合は、最初の値が生成されます.
明らかに私は2つ目の状況で、えっ、私を朝にして、やっと解決しました!!!
変更後
@Query(value = " select new com.dfl.ycp3.enquiry.dto.SmsCountDTO(s.areaType) from SmsCountEntity  s where (coalesce(?1, null) is null or s.areaType in (?1)) and (coalesce(?2, null) is null or s.cityCode in (?2)) order by s.dateCreate desc ")
    Page findSmsCountPage( List areaList, Pageable pageable);

なぜこのcoalesceはこんなに不思議なのですか?公式ドキュメントの説明:式を作成し、すべてのパラメータの評価結果がnullの場合はnullを返します.そうでない場合は、最初のnull以外のパラメータの値を返します.
参考文献:https://www.objectdb.com/api/java/jpa/criteria/CriteriaBuilder/coalesce_Expression__Y https://stackoverflow.com/questions/24551177/hql-unexpected-ast-node-vector https://cloud.tencent.com/developer/ask/218262