spring-data-jpa 在Sping Boot 中使用JPA查询查找数组元素

dba5bblo  于 2022-11-10  发布在  Spring
关注(0)|答案(2)|浏览(185)

我尝试在数组中查找数组元素,但遇到错误
第一个
我发现错误是由于查询中的此行

"(COALESCE(:motherLanguage, NULL) is null or i.personalDetail.motherLanguage IN (:motherLanguage))"

我的查询对state参数正确工作,因为state只是一个字符串,而motherLanguage是一个数组。
基本上,我想知道如何使用数组在数组中进行查询。如果在Internet上找到了SELECT ARRAY[1,2] && ARRAY[1,3,4,7];,但当我尝试将&&放入JPA查询时,它会出现错误

"(COALESCE(:motherLanguage, NULL) is null or i.personalDetail.motherLanguage && (:motherLanguage))"

这是波纹管查询的错误
一个

oyxsuwqo

oyxsuwqo1#

您应该将JPQL查询重写为:

@Query(
    "SELECT i FROM User OR WHERE (i.personalDetail.gender = :gender) AND " +
    "(:country IS NULL OR i.contactDetail.country = :country) AND " +
    "(:state IS NULL OR i.contactDetail.state IN :state) AND " +
    "(:motherLanguage IS NULL OR i.personalDetail.motherLanguage IN :motherLanguage)"
)

JPA应该足够智能,可以直接将绑定集合与空值进行比较,不需要像使用COALESCE()那样使用它。

nbysray5

nbysray52#

请尝试使用两个参数:

(:motherLanguageB IS NULL OR i.personalDetail.motherLanguage IN :motherLanguage)

如果列表为空,则强制为空:

if(motherLanguages != null && motherLanguages.isEmpty()) motherLanguages = null;

并设置参数(不知道如何用Spring Data进行此操作):

setParameter("motherLanguageB", motherLanguages == null ? null : 1)
.setParameter("motherLanguage", motherLanguages);

相关问题