我正在尝试编写一个 HQL 查询,它根据多个条件从表中选择行。名字,姓氏
问题是查询应该灵活地忽略任何空值或空值
所以
select t from table t where (:firstname = '' or t.firstName = :firstName) AND
(:lastName = '' OR t.lastName = :lastName)
我会认为这会起作用吗?但它没有 - 它从不返回任何行?任何想法这里可能有什么问题?我对 HQL 很陌生,这就是这个问题的原因。
我正在尝试编写一个 HQL 查询,它根据多个条件从表中选择行。名字,姓氏
问题是查询应该灵活地忽略任何空值或空值
所以
select t from table t where (:firstname = '' or t.firstName = :firstName) AND
(:lastName = '' OR t.lastName = :lastName)
我会认为这会起作用吗?但它没有 - 它从不返回任何行?任何想法这里可能有什么问题?我对 HQL 很陌生,这就是这个问题的原因。
如果我理解正确,您想要一种允许用户按名字、姓氏或两者搜索的方法。因此,您应该检查传入的参数是否为空,然后不要将其设为条件。如果他们提供所有空白参数,它将返回整个表。尝试:
select t from table t
where (:firstname IS NULL or t.firstName = :firstName) AND
(:lastName IS NULL OR t.lastName = :lastName)
(:firstname = '' or t.firstName = :firstName)
你的标准很奇怪。如果 :firstname = '' 并且如果数据库中的 firstname (t.firstName) 等于 '',则条件 t.firstName = :firstName 是好的 ('' = '')
你不需要 :firstname = ''
但是如果你想检查空值,你需要这样做:
t.firstName IS NULL or t.firstName = :firstname
如果您在 firstname 参数设置为空字符串的情况下运行 hql 会发生什么?
select t from table t where (:firstname = '')
然后将 firstname 参数设置为 null:
select t from table t where (:firstname is null)
如果上述任何一项返回整个表,则 HQLs 命名参数可能支持您尝试执行的操作。
否则,您必须对空参数情况使用不同的查询。您可以通过动态生成查询来做到这一点。
我有类似的要求。我想要动态,但我使用的工具只提供 HQL 编辑器,所以没有 Java。
下面的查询允许使用可选参数。本质上是一种伪类异或。. . 希望有真正的异或:/
使用此查询,您只需将 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 ))