Hibernate本地查询可选参数抛出'operator does not exist: bigint = bytea'错误

4

我有以下查询:

SELECT id FROM table1 WHERE (:param IS NULL OR id_or_smth = :param)

param参数是可选的,因此可以为null

  1. 我创建了一个javax.persistance.Query
  2. 然后我使用setParameter("param", null)设置了该参数
  3. 当我调用getResultList()时,出现以下错误:

Caused by: org.hibernate.exception.SQLGrammarException: ERROR: operator does not exist: bigint = bytea

我该如何处理这个问题?


当参数为空时,你真的想获取表中的所有记录吗? - deterministicFail
在Javadoc中我发现setParameter函数的第二个参数必须非空。 - Duracel
解决方法是,当参数为空时,您可以设置一些默认模式并将其放入等号中。 - bitkot
deterministicFail:我只是试图简化我的查询:搜索传递的参数是否不为空。但似乎这样行不通。 - Duracel
2个回答

1

HQL和Criteria只能在指定实际的实体属性/表列时起作用,因此以下内容无法起作用:

:param IS NULL

如果id_or_smth是Table1列名,那么你的查询应该如下所示:
Query q = entityManager.createNativeQuery("SELECT id FROM table1 WHERE id_or_smth IS NULL or id_or_smth = :param");
q.setParameter("param", paramValye);
q.getResultList();

参数值不能为空。

在SQL中,您必须始终使用IS NULLIS NOT NULL,因为查询如下:

SELECT id FROM table1 WHERE id_or_smth = NULL

即使存在满足id_or_smth IS NULL条件的行,该语句始终会返回一个空结果。


好的,那么有没有一个对象可以传递给 SQL,它引用 NULL 值?sql.Types.NULL 不起作用。我只是不想改变查询,但希望以某种方式传递 NULL 值 :) - Duracel
等等,我没有注意到...WHERE id_of_somth IS NULL... 我想要的是只有在传递的:param不为空时才按列id_of_smth搜索。 - Duracel
IS(NOT)NULL是你要寻找的SQL结构。即使在JDBC中,传递null也不起作用。 - Vlad Mihalcea

0
也许你可以使用条件查询代替:

Criteria crit = sess.createCriteria(Table1.class);
crit.setProjection(Restrictions.id());
if (param != null) crit.add(Restrictions.eq("id_or_smth", param));

List result = crit.list();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接