QueryDSL Spring Data JPA 运算符优先级

14
public interface ItemRepository extends JpaRepository<Item, Integer> {
   List<Item> findByNameAndDescriptionIsNullOrDescription(String name, String desc); 
 }

在本地查询中,findByNameAndDescriptionIsNullOrDescriptionwhere 条件被翻译为

where item0_.NAME=? and (item0_.DESC is null) or item0_.DESC=? 

我需要有where item0_.NAME=? and (item0_.DESC is null or item0_.DESC=?)

我正在使用以下内容:

  • spring-data-commons-1.6.3.RELEASE.jar

  • spring-data-jpa-1.4.3.RELEASE.jar

  • (i)hibernate-entitymanager-4.2.14.SP1-redhat-1.jar,(ii) hibernate-jpa-2.0-api-1.0.1.Final-redhat-2.jar由JBOSS EAP 6.3提供


QueryDSL与这个问题的相关性是什么?本地查询将是一个SQL查询。 - Neil Stockton
3个回答

4

可能你做不到那样。

Spring Data querydsl仅用于简单的SQL查询,如果您需要更复杂的内容,请使用@Query注释。

这也会让其他开发人员更容易理解您所使用的查询,而不是分析您的方法名称。


2

And 运算符的优先级高于 or 运算符。在 JPA 查询中更改此优先级或使用括号是不可能的,但您可以尝试将 and 运算符扩展到其他运算符上:

findByNameAndDescriptionOrNameOrDescriptionIsNull

现在你的逻辑从这里开始评估:

item0_.NAME=? and (item0_.DESC is null or item0_.DESC=?)

to:

(item0_.NAME=? and item0_.DESC=?) or (item0_.NAME=? and item0_.DESC is null)

0

为什么需要添加第二个参数 desc.. 只需使用以下代码:

List findByNameAndDescription(String name, String desc);

即使您将 desc 参数设置为 null,也会获得所需的结果。


请参见https://dev59.com/0Ww15IYBdhLWcg3w6f80。 - lab bhattacharjee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接