Java 当直接返回query.getSingleResult()时,JPA返回null
我对hibernate和jpa有一个非常奇怪的问题。下面是两段代码:Java 当直接返回query.getSingleResult()时,JPA返回null,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,我对hibernate和jpa有一个非常奇怪的问题。下面是两段代码: public Object getObject(Date date) { try { Query query = entityManager .createQuery( "select ob from Object ob where date= :date"); query.setParameter("da
public Object getObject(Date date) {
try {
Query query = entityManager
.createQuery(
"select ob from Object ob where date= :date");
query.setParameter("date", date);
return (Object)query.getSingleResult();
} catch (EmptyResultDataAccessException e) {
logger.debug(String.format("No Result found - date[%s]",date));
return null;
}
}
第一种方法每次生成EmptyResultDataAccessException,即使给定了日期匹配的有效记录。第二个返回预期的结果。有人遇到过这种情况吗?是什么导致了这种行为
请假设存在所有其他语法内容(事务、初始化的entitymanager等)。我唯一要更改的是查询结果是直接在返回中检索还是先分配给变量。这是不可能的。这两种变体是等效的。也许你遗漏了一些东西
请注意,
getSingleResult()
如果有多个结果,则会引发异常。它是可能的,我以前也遇到过它。我认为这与Hibernate正在进行的字节码操作有关。要找到问题的根源,您必须深入到一个非常黑暗的实现层次
在使用Hibernate/JPA时,我总是使用第二种模式。这是不幸的,因为它使代码更加冗长,但不值得深入研究生成的字节码并试图理解它。可能是我的问题可能没有帮助,但是,您真的确定这两个请求是相同的吗?请执行一个简单的复制/粘贴,然后重新测试,我很确定您的陈述是正确的。我和几个同事坐在这里,我们一直在编辑和重新部署jar,只做了一个更改。这真的很奇怪。我不断地从这个方法得到一个空的返回。我在阳光下尝试了一切,直到我将
getSingleResult()
调出到一个作业,它才意外地开始工作。异常情况到底是什么样的?不,我回到原点了。我完全按照我的建议做了,并建立了一个独立的示例,现在这个示例又开始工作了。现在我不确定这是否相关。我努力工作,试图复制。我无法真正再现的唯一区别是,我们正在使用编译时方面编织来获取已部署应用程序中的@Transactional属性,并且它正在容器中运行。这是一些正交的原因。它与返回语句无关。它似乎完全是断断续续的。我想我只是在偶然的时候改变了一些事情。我倾向于同意你的看法。我完全愿意接受建议。我猜你没有运行你认为你是的代码(没有正确编译/部署它/在类路径上有两次),或者你没有访问你认为你是的数据(每个都在访问不同的数据库或在不同的事务中),无论hibernate做什么,保留在查询对象中,也可能保留在实体中。我打赌编译器为这两个版本生成相同的输出在Hibernate的运行时会进行大量字节码操作,以支持延迟加载和其他概念。一旦代码在这样一个级别上被操作,就几乎不可能对代码行为进行静态推理。hibernate所做的是实体子类的代码生成,但这与调用查询
对象无关。@Bozho有一个简单的方法来找出人。也许我疯了。举一个小例子,看看它是否发生在你的hibernate-jpa-2.0-1.0.0上
public Object getObject(Date date) {
try {
Query query = entityManager
.createQuery(
"select ob from Object ob where date= :date");
query.setParameter("date", date);
Object ret = (Object)query.getSingleResult();
return ret;
} catch (EmptyResultDataAccessException e) {
logger.debug(String.format("No Result found - date[%s]",date));
return null;
}
}