我使用Hibernate作为ORMapper。我想执行一个非常简单的hql查询:
SELECT a
FROM Foo a
WHERE a.status = :A0status
ORDER BY a.bookingTypeCode ASC,
a.priority ASC
这个hql查询然后被转换成一个sql查询,看起来像这样:
select a.*
from Foo a
where a.status='A'
order by a.bookingtypecode ASC,
a.priority ASC
当我使用Oracle SQL Developer在Oracle数据库上执行SQL时,我返回了17行。然而,当我执行hql查询(使用Query
的list方法)时,我得到了一个包含17个元素的列表,这些元素都是null
。虽然元素的数量是正确的,但实际上没有加载任何元素。
这是我创建和执行查询的方式:
// the hql query is stored in the hqlQuery variable;
// the parameter are stored in a Map<String, Object> called params
Query hQuery = hibSession.createQuery(hqlQuery);
for (Entry<String, Object> param : params.entrySet()) {
String key = param.getKey();
Object value = param.getValue();
hQuery.setParameter(key, value);
}
List<?> result = hQuery.list();
有人知道这里可能有什么问题吗?
更新1
我最近从Hibernate 3.2升级到4.3.5。在升级之前,一切都很好。升级后我得到这个错误。
4条答案
按热度按时间v64noz0r1#
我已经将休眠的日志级别设置为TRACE,并发现了问题。这实际上是一个Map/逻辑/数据库错误。主键由两列组成(根据实体类),其中一列可以为空。但是,主键永远不能为空。因此,Hibernate总是返回null。
kuuvgm7e2#
如果您还没有设置自定义的(并且有bug的)ResultTransformer,我的第二个最佳猜测是您的调试器在欺骗您。你的代码是否真的接收到一个null列表?
另外,请确保使用您正在显示的代码进行测试。太多时候,人们把事情简单化,魔鬼就在细节中。
6pp0gazn3#
这个错误发生在我身上。MySQL查询浏览器的作品,但在休眠的7列,只有一列总是与所有空字段。我检查了所有的ID,它们不是空的。错误发生在SQL Native的构造中。我不得不改变写作的方式。AI工作。
xvw2m8pv4#
这个错误出现在我升级遗留代码到Hibernate 5和修复单元测试沿着。主键(在我的例子中是复合键)由两列组成(根据实体类)。但是,测试数据并没有填充这两列的数据。在新版本的Hibernate中,主键(或者在我的例子中是复合键的一部分)永远不能为null。因此,Hibernate总是返回null。
我只是更新了测试数据,以包含构成复合键的两个列的数据,并且hibernate开始返回有效的结果。