Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当直接返回query.getSingleResult()时,JPA返回null_Java_Hibernate_Jpa_Orm - Fatal编程技术网

Java 当直接返回query.getSingleResult()时,JPA返回null

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

我对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;
    }
}

第一种方法每次生成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;
    }
}