Hibernate返回空值列表,尽管执行的SQL返回值

9udxz4iz  于 8个月前  发布在  其他
关注(0)|答案(4)|浏览(71)

我使用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。在升级之前,一切都很好。升级后我得到这个错误。

v64noz0r

v64noz0r1#

我已经将休眠的日志级别设置为TRACE,并发现了问题。这实际上是一个Map/逻辑/数据库错误。主键由两列组成(根据实体类),其中一列可以为空。但是,主键永远不能为空。因此,Hibernate总是返回null。

kuuvgm7e

kuuvgm7e2#

如果您还没有设置自定义的(并且有bug的)ResultTransformer,我的第二个最佳猜测是您的调试器在欺骗您。你的代码是否真的接收到一个null列表?
另外,请确保使用您正在显示的代码进行测试。太多时候,人们把事情简单化,魔鬼就在细节中。

6pp0gazn

6pp0gazn3#

这个错误发生在我身上。MySQL查询浏览器的作品,但在休眠的7列,只有一列总是与所有空字段。我检查了所有的ID,它们不是空的。错误发生在SQL Native的构造中。我不得不改变写作的方式。AI工作。

SELECT c.idContratoEmprestimo as idContratoEmprestimo,
c.dtOperacao as dataOperacao,
p.cpf as cpf,
p.nome as nome,
(Select count(p2.idParcelaEmprestimo) from EMP_PARCELA p2 where p2.valorPago > 0 and p2.dtPagamento is not null
and p2.idContratoEmprestimo = c.idContratoEmprestimo and p2.mesCompetencia <= '2014-08-01') as parcelasPagas, c.numeroParcelas as numeroParcelas,
pe.valorPago as valorParcela
FROM EMP_CONTRATO c inner join TB_PARTICIPANTE_DADOS_PLANO AS pp on pp.idParticipantePlano = c.idParticipantePlano
inner join TB_PARTICIPANTE as p on p.id = pp.idParticipante
inner join TB_PARTICIPANTE_INSTITUIDOR as pi on pi.PARTICIPANTE_ID = p.id
inner join EMP_PARCELA as pe on pe.idContratoEmprestimo = c.idContratoEmprestimo
where c.dtInicioContrato <= '2014-08-01' and pi.INSTITUIDOR_ID = 1
and c.avaliado is true
and pe.mesCompetencia = '2014-08-01'
and c.deferido is true
and c.dtQuitacao is null
and c.dtExclusao is null
and pe.valorPago is not null
group by c.idContratoEmprestimo
order by p.nome
xvw2m8pv

xvw2m8pv4#

这个错误出现在我升级遗留代码到Hibernate 5和修复单元测试沿着。主键(在我的例子中是复合键)由两列组成(根据实体类)。但是,测试数据并没有填充这两列的数据。在新版本的Hibernate中,主键(或者在我的例子中是复合键的一部分)永远不能为null。因此,Hibernate总是返回null。
我只是更新了测试数据,以包含构成复合键的两个列的数据,并且hibernate开始返回有效的结果。

相关问题