2012-02-06 104 views
3

我有一个hibernate和jpa很奇怪的问题。下面是两个代码块:当query.getSingleResult()直接返回时,JPA返回null

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

可能是我的问题可能是无益的,但是,你真的确定这两个请求是相同的吗?请执行一个简单的复制/粘贴,然后重新测试,我很确定你的陈述是正确的。 – Zakaria 2012-02-06 20:45:39

+0

我正和几位同事坐在一起,我们一直在编辑和重新部署这个罐子,只做了一次改变。它真的很奇怪。我不断从这个方法得到空回报。我在太阳下试过所有的东西,直到我把这个'getSingleResult()'调用到一个任务开始意外工作的任务中。 – nsfyn55 2012-02-06 20:52:45

+0

例外看起来如何? (stacktrace) – Bozho 2012-02-06 21:00:10

回答

0

这是不可能的。这两个变体是相同的。也许你错过了一些东西。

请注意,如果结果超过1个,则getSingleResult()可能会引发异常。

+0

我会倾向于同意你的看法。我完全接受建议。 – nsfyn55 2012-02-06 20:46:30

+0

我的猜测是你没有运行你认为你的代码(没有正确编译/部署它/在类路径中有两次),或者你没有访问你认为你的数据(每个访问不同的数据库或在不同的事务) – James 2013-09-16 14:18:11

1

IS可能的,我也遇到过它。我认为这与Hibernate正在做的字节码操作有关。为了找到它的根源,你必须进行深入而深入的实施。

使用Hibernate/JPA时,我总是使用第二种模式。这很不幸,因为它使得代码更加冗长,但不值得陷入生成的字节码的深度并试图理解它。

+0

无论hibernate做什么,都停留在Query对象中,可能还有实体。我敢打赌编译器为这两个版本产生相同的输出 – Bozho 2012-02-06 20:48:25

+0

在Hibernate的** run-time **中有很多字节代码操作来支持延迟加载和其他概念。一旦代码在这样的级别上被操纵,几乎不可能应用关于代码行为的静态推理。 – 2012-02-06 20:51:42

+0

hibernate做的是实体子类的代码生成,但这与调用“Query”对象无关。 – Bozho 2012-02-06 20:57:48

相关问题