你们可以告诉我为什么这个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.*
我没有任何关系。
编辑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=?
我的java版本是1.7.0_79。
答案 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()
检查。
旁注:我没有尝试删除条目,然后在&
调用中查看结果会是什么,但这是可能的,看看我得到了什么,然后检查该值,正确空?