Привет, может ли кто-нибудь сказать мне, почему этот 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.

0
Yantes 16 Дек 2016 в 12:07
Оба запроса возвращают 0?
 – 
Khalil M
16 Дек 2016 в 12:18
M да, оба запроса возвращают 0, и я не могу понять, почему.
 – 
Yantes
16 Дек 2016 в 12:20
1
1. Я не могу понять, почему у вас есть два аргумента в предложении where, но только одно условие из журнала гибернации. 2. удалите все аргументы из предложения where и проверьте результат. 3. Проверить значение resp.getHeader().getCorrelationID(). 4. Проверьте соединение с базой данных, возможно, вы подключаетесь к другой базе данных.
 – 
degr
16 Дек 2016 в 12:28
Я не могу понять приведение к long в "long result = (long) q.getFirstResult ();" Почему вы приводите результат к long вместо MdmAudit.class?
 – 
Tobias Otto
16 Дек 2016 в 12:35
Ваша проблема, скорее всего, заключается в значениях ваших параметров: resp.getHeader().getCorrelationID(), resp.getHeader().getVerb()
 – 
Turbut Alin
16 Дек 2016 в 12:46

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(), но это будет возможность и посмотреть, что я получу, а затем проверить это значение, по сути, нулевое?

1
Yantes 16 Дек 2016 в 13:35