具有多个条件的HQL查询

时间:2010-08-04 09:32:48

标签: hql named-parameters

我正在尝试编写一个HQL查询,它根据多个条件从表中选择行。 firstName,lastName

问题是查询应该灵活地忽略任何空值或空值

所以

select t from table t where (:firstname = '' or t.firstName = :firstName) AND
(:lastName = '' OR t.lastName = :lastName)

我原以为这会起作用?但它没有 - 它永远不会返回任何行?任何想法在这里可能是错的?我对HQL很新,这就是为什么这个问题。

4 个答案:

答案 0 :(得分:2)

如果我理解正确,您想要一种允许用户按firstName,lastName或两者搜索的方法。所以你应该检查传入的参数是否为空,然后不要使它成为一个条件。如果它们提供所有空白参数,它将返回整个表格。尝试:

select t from table t 
where (:firstname IS NULL or t.firstName = :firstName) AND
(:lastName IS NULL OR t.lastName = :lastName)

答案 1 :(得分:0)

(:firstname = '' or t.firstName = :firstName)

你的标准很奇怪。如果:firstname =''并且如果数据库中的名字(t.firstName)相等',则标准t.firstName =:firstName是好的(''='')

您不需要:firstname =''

但是如果要检查空值,则需要执行以下操作:

t.firstName IS NULL or t.firstName = :firstname

答案 2 :(得分:0)

如果你运行以下hql并将firstname参数设置为空字符串会发生什么?

select t from table t where (:firstname = '') 

并将firstname参数设置为null:

select t from table t where (:firstname is null) 

如果以上任何一项返回整个表,则HQL的命名参数可能会支持您要执行的操作。

否则,您必须对null参数案例使用不同的查询。您可以通过动态生成查询来完成此操作。

答案 3 :(得分:0)

我有类似的要求。我想要动态,但我正在使用一个只提供HQL编辑器的工具,所以没有Java。

下面的查询允许使用可选参数。基本上是一种伪quazi XOR。 。 。希望有真正的XOR:/

使用此查询,您只需将NA放入参数中,而不是在不需要时将其留空。

是的,是的,是的。 。 。它很难看,但它很有效,并且很容易改变到纯HQL中需要可选参数的任何其他场景。

SELECT t AS table
FROM Table t
WHERE (t.valSet = :valSet 
    AND (:category= 'NA' AND :subCategory= 'NA'))
OR (:category != 'NA'
    AND (t.valSet = :valSet 
        AND t.category= :category))
OR (:subCategory != 'NA'
    AND (t.valSet = :valSet 
        AND t.subCategory = :subCategory ))