我对hibernate和jpa有一个非常奇怪的问题。以下是两段代码:
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;
}
}
...
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;
}
}
每次第一次生成EmptyResultDataAccessException,即使给出了日期匹配的有效记录。第二个返回预期的结果。有没有遇到过这个?是什么导致了这种行为?
请假设存在所有其他合成事物(事务,初始化实体管理器等),我唯一要改变的是查询结果是直接在返回中检索还是首先分配给变量。
答案 0 :(得分:1)
IS 可能,我之前也遇到过它。我认为这与Hibernate正在进行的字节代码操作有关。要找到它的根源,你必须进入一个非常深刻和黑暗的实施阶段。
使用Hibernate / JPA时,我总是使用第二种模式。这很不幸,因为它使代码更加冗长,但是不值得深入研究生成的字节代码并试图理解它。
答案 1 :(得分:0)
那是不可能的。这两种变体是等价的。你可能会遗漏一些东西。
请注意,如果结果超过1,getSingleResult()
可能会抛出异常。