Java 当参数是动态的时,如何构建JPQL查询?

Java 当参数是动态的时,如何构建JPQL查询?,java,hibernate,jpa,ejb,jpql,Java,Hibernate,Jpa,Ejb,Jpql,我想知道是否有一个基于过滤器构建JPQL查询的好解决方案(我的查询太“富于表现力”,无法使用条件) 比如: query = "Select from Ent" if(parameter!=null){ query += "WHERE field=:parameter" } if(parameter2!=null) { query += "WHERE field2=:parameter2" } 但是我会在哪里写两次!!随着参数个数的增加,因果关系爆炸。因为最终可能没有或全部为空 有没

我想知道是否有一个基于过滤器构建JPQL查询的好解决方案(我的查询太“富于表现力”,无法使用条件)

比如:

query = "Select from Ent"
if(parameter!=null){
   query += "WHERE field=:parameter"
}
if(parameter2!=null) {
   query += "WHERE field2=:parameter2"
}
但是我会在哪里写两次!!随着参数个数的增加,因果关系爆炸。因为最终可能没有或全部为空


有没有关于以适当方式基于过滤器构建这些查询的提示?

为什么不能使用条件

其他选项(不太好的imho):

为每个条件创建两个查询,然后调用相应的查询

或者建立一个字符串并使用

哦,你是说弦的形成(?):


(我认为弦的形成很难看,但这似乎是人们要求的)

谢谢!但有时我必须应用过滤器(当它不为null时),有时则不能。所以命名查询不能解决问题,本地查询也不能…+1。CriteriaAPI是动态构造查询的方法。这就是这个API的全部要点。@edutesoy.,我不明白为什么解决方案在您的情况下不起作用。@JB Nizet:除非Criteria API表达能力不够,并且您除了在HQL中执行它之外别无选择(正如我在问题中明确指出的)。我已经知道标准适用于这些情况,但这次我不能使用它,因为它不够强大。请参阅我的上一个问题,其中我尝试用标准表达一些似乎不可能的东西:@JB Nizet它可以工作,但与没有命名查询时完全相同。我仍然需要处理一堆嵌入的IFs来决定是否需要在何处放置一个,是否需要放置一个或,是否需要放置一个逗号。。。。我不知道你是否明白我的意思。最后,我解决了调用submethods在独立作用域中逐步构造字符串的问题。这将帮助您在查询中选择字段过滤器大多数人不知道这个解决方案的答案
query = "Select from Ent where 1=1 "
if(parameter!=null){
   query += " and field=:parameter"
}
if(parameter2!=null) {
   query += " and field2=:parameter2"
}
select * from Ent    
    where (field1 = :parameter1 or :parameter1 is null)       
    and (field2 = :parameter2 or :parameter2 is null)