我正在使用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。升级之前一切正常。升级后,我收到此错误。
答案 0 :(得分:9)
我已将休眠日志级别设置为TRACE并发现问题。它实际上是映射/逻辑/数据库错误。主键由两列组成(根据实体类),其中一列可以为空。但是,主键永远不能为空。因此,hibernate总是返回null。
答案 1 :(得分:1)
如果你还没有设置自定义(和错误)ResultTransformer,我的第二个最好的猜测是你的调试器对你说谎。你的代码实际上是否收到了null列表?
还要确保使用您显示的代码进行测试。很多时候,人们会简化事物,而魔鬼就是细节。
答案 2 :(得分:0)
这个错误发生在我身上。 MySQL查询浏览器工作,但在7列的休眠中,只有一列总是带有所有空字段。我检查了所有ID,但它们不是空的。错误在于构建SQL Native。我不得不改变写作的方式。艾工作。
{{1}}