Привет, может ли кто-нибудь сказать мне, почему этот 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( name="MdmAuditDAO.GetData", query="SELECT m FROM MdmAuditDAO m WHERE m.correlationId = :correlationId AND m.verb = :verb")
public class MdmAuditDAO implements Serializable {
У меня есть геттеры и сеттеры в моем классе MdmAuditDAO, и я проверил именование переменных, и они идентичны, как в NamedQuery, поэтому проблема не в этом.
Моя проблема в том, что у меня есть три записи в моей базе данных, я должен получить хотя бы один ответ, но в моем результате я получаю 0.
MdmAuditDAO определен в моем persistence.xml и в моем ehcache.xml. Так почему же результат, который я возвращаю, равен 0? Я также попытался получить возвращенный объект или список объектов, и это тот же результат, ничего не возвращается, но когда я запускаю свой запрос в своей базе данных mssql, я получаю результаты, см. Рисунок ниже. Это не имеет ничего общего с m.*
, я также получаю результаты, когда использую это в своем операторе SELECT.
ИЗМЕНИТЬ 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.
1 ответ
Я нашел решение http://www.objectdb.com/api/java/ jpa / Query / getFirstResult возвращает позицию первого элемента, но меня немного смутила фраза
Возвращает 0, если setFirstResult не был применен к объекту запроса.
Я не мог осмыслить это, чтобы понять это.
Мое решение теперь состоит в том, что я просто возвращаю список объектов
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()
, но это будет возможность и посмотреть, что я получу, а затем проверить это значение, по сути, нулевое?
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
1.
Я не могу понять, почему у вас есть два аргумента в предложении where, но только одно условие из журнала гибернации.2.
удалите все аргументы из предложения where и проверьте результат.3.
Проверить значениеresp.getHeader().getCorrelationID()
.4.
Проверьте соединение с базой данных, возможно, вы подключаетесь к другой базе данных.resp.getHeader().getCorrelationID()
,resp.getHeader().getVerb()