2011-09-08 65 views
1

我不知道是否有一个很好的解决方案来建立一个基于过滤器的JPQL查询(我的查询太“表现力”,我不能使用Criteria)。如何在参数动态时构建JPQL查询?

喜欢的东西:

query = "Select from Ent" 
if(parameter!=null){ 
    query += "WHERE field=:parameter" 
} 
if(parameter2!=null) { 
    query += "WHERE field2=:parameter2" 
} 

,但我会写到哪两次!随着参数数量的增加,casuistic会爆炸。因为最终没有或全部可能为空。

任何提示基于正确的方式构建这些基于过滤器的查询?

回答

3

为什么不能使用标准like this

其他选项(不太好的恕我直言):

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

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

哦,你刚才的意思是串成形(?):

query = "Select from Ent where 1=1 " 
if(parameter!=null){ 
    query += " and field=:parameter" 
} 
if(parameter2!=null) { 
    query += " and field2=:parameter2" 
} 

(我认为这串成形是丑陋的,但它似乎被什么要求)

+0

谢谢您!但有时我必须应用过滤器(当它不是空的时候),有时候不需要。如此命名的查询并不能解决问题,原生查询也可以...... – edutesoy

+1

+1。标准API是动态构建查询的途径。这就是这个API的重点。 –

+0

@edutesoy。,我不明白为什么解决方案不适合你的情况。 – NimChimpsky

2
select * from Ent  
    where (field1 = :parameter1 or :parameter1 is null)  
    and (field2 = :parameter2 or :parameter2 is null)