我正在尝试编写一个HQL查询,它根据多个条件从表中选择行。 firstName,lastName
问题是查询应该灵活地忽略任何空值或空值
所以
select t from table t where (:firstname = '' or t.firstName = :firstName) AND
(:lastName = '' OR t.lastName = :lastName)
我原以为这会起作用?但它没有 - 它永远不会返回任何行?任何想法在这里可能是错的?我对HQL很新,这就是为什么这个问题。
答案 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 ))