0

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

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

所以

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

我会认为这会起作用吗?但它没有 - 它从不返回任何行?任何想法这里可能有什么问题?我对 HQL 很陌生,这就是这个问题的原因。

4

4 回答 4

2

如果我理解正确,您想要一种允许用户按名字、姓氏或两者搜索的方法。因此,您应该检查传入的参数是否为空,然后不要将其设为条件。如果他们提供所有空白参数,它将返回整个表。尝试:

select t from table t 
where (:firstname IS NULL or t.firstName = :firstName) AND
(:lastName IS NULL OR t.lastName = :lastName)
于 2010-08-04T16:41:39.917 回答
0

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

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

你不需要 :firstname = ''

但是如果你想检查空值,你需要这样做:

t.firstName IS NULL or t.firstName = :firstname
于 2010-08-04T09:38:31.887 回答
0

如果您在 firstname 参数设置为空字符串的情况下运行 hql 会发生什么?

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

然后将 firstname 参数设置为 null:

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

如果上述任何一项返回整个表,则 HQLs 命名参数可能支持您尝试执行的操作。

否则,您必须对空参数情况使用不同的查询。您可以通过动态生成查询来做到这一点。

于 2010-08-04T10:08:20.640 回答
0

我有类似的要求。我想要动态,但我使用的工具只提供 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 )) 
于 2016-01-19T23:36:48.013 回答