为什么这个Java查询失败了?有结果

时间:2016-12-16 09:07:05

标签: java sql-server hibernate

你们可以告诉我为什么这个java查询失败了吗?

Query q = entityManager.createNativeQuery("SELECT m.* FROM MdmAudit m WHERE m.correlationID = :correlationId AND m.verb = :verb", MdmAuditDAO.class);
            //Query q = entityManager.createNamedQuery("MdmAuditDAO.GetData");
            q.setParameter("correlationId", resp.getHeader().getCorrelationID());
            q.setParameter("verb", resp.getHeader().getVerb());

            long result = (long) q.getFirstResult();

namedQuery:

@NamedQuery( name="MdmAuditDAO.GetData", query="SELECT m FROM MdmAuditDAO m WHERE m.correlationId = :correlationId AND m.verb = :verb")
public class MdmAuditDAO implements Serializable {

我在MdmAuditDAO类中有getter和setter,我检查了变量的命名,它们与NamedQuery中的相同,所以问题不在于此。

我的问题是我的数据库中有三个条目,我至少应该得到一个答案,但我的结果是0。

MdmAuditDAO在我的persistence.xml和我的ehcache.xml中定义。那么为什么我得到的结果是0?我还试图获得一个返回的对象或一个对象列表,它是相同的结果,没有返回任何东西,但当我在我的mssql数据库中运行我的查询时,我得到的结果见下图。当我在SELECT语句中使用它时,它与m.*我没有任何关系。 enter image description here

编辑1:这是我从休眠日志中得到的,我不知道怎么读这个?

Hibernate: 
    select
        mdmauditda0_.id as id1_7_,
        mdmauditda0_.correlationID as correlat2_7_,
        mdmauditda0_.messageID as messageI3_7_,
        mdmauditda0_.meter_no as meter_no4_7_,
        mdmauditda0_.noun as noun5_7_,
        mdmauditda0_.payload as payload6_7_,
        mdmauditda0_.source as source7_7_,
        mdmauditda0_.subtype as subtype8_7_,
        mdmauditda0_.time as time9_7_,
        mdmauditda0_.verb as verb10_7_ 
    from
        MdmAudit mdmauditda0_ 
    where
        mdmauditda0_.correlationID=?

我需要设置什么,以获取更多信息?我正在使用以下罐子 enter image description here

我的java版本是1.7.0_79。

1 个答案:

答案 0 :(得分:1)

我发现解决方案http://www.objectdb.com/api/java/jpa/Query/getFirstResult返回第一个元素的位置,但我对这句话感到有点困惑

  

如果未将setFirstResult应用于查询对象,则返回0.

无法理解它,无法理解它。

我现在的解决方案是,我只返回一个对象列表

Query q = entityManager.createNativeQuery("SELECT m.* FROM MdmAudit m WHERE m.correlationId = :correlationId AND verb = :verb", MdmAuditDAO.class);
            //Query q = entityManager.createNamedQuery("MdmAuditDAO.GetData");
            q.setParameter("correlationId", resp.getHeader().getCorrelationID());
            q.setParameter("verb", resp.getHeader().getVerb());
            List<MdmAuditDAO> mdmAuditList = q.getResultList();

然后它工作正常,我得到了结果。因此,我在代码中稍后执行result == 0检查,而不是NULL and isEmpty()检查,而是执行q.getFirstResult()检查。

旁注:我没有尝试删除条目,然后在&调用中查看结果会是什么,但这是可能的,看看我得到了什么,然后检查该值,正确空?