Подзапрос jpql (NamedQuery) не работает с параметром

Я использую JPQL и NamedQuery для запроса базы данных в комбинированном вопросе.

@NamedQuery(name = "Entry.findAllForName", query = "Select p From Entry p Where p.entryId In(Select dp.entry From EntryPart dp Where dp.part IN(Select d From Part d Where d.senderId = :name))"),

Когда я запускаю этот запрос, используя:

Query query = em.createNamedQuery("Entry.findAllForName").setParameter("name", name);
List<Entry> list = query.getResultList();
logger.info("Complete query size: {}", list.size());

Это возвращает набор результатов, но это 0.

Когда я изменяю именованный запрос на:

@NamedQuery(name = "Entry.findAllForName", query = "Select p From Entry p Where p.entryId In(Select dp.entry From EntryPart dp Where dp.part IN(Select d From Part d Where d.senderId = 'SenderName'))"),

Это работает, и я получаю ожидаемый результат базы данных.

Я не так хорошо знаком с JPQL и @NamedQueries, но я не вижу разницы между наличием String vaule и значением параметра, поскольку, когда я делаю diff, они одинаковы.

logger.info("SenderName == {} ? {}", name, name.equals("SenderName"));

Это возвращает "SenderName == SenderName? true"...

Лучший, Хенрик


person Hiny    schedule 03.06.2014    source источник
comment
Можете ли вы отладить и проверить значение имени здесь --›Query query = em.createNamedQuery(Entry.findAllForName).setParameter(name, name);   -  person Gayathri    schedule 03.06.2014
comment
Да, я также вижу, что отладка говорит, что найден параметр «имя» и задано значение «Имя отправителя».   -  person Hiny    schedule 04.06.2014


Ответы (2)


Я не могу воспроизвести вашу проблему. Я получил ожидаемые результаты. Не могли бы вы опубликовать больше кода? Вот код, который я тестировал и работал. Я получил этот пример от Java2s для быстрой настройки. Но сначала это не сработало, поэтому я внес некоторые изменения. Пример именованного запроса Java2 Я внес следующие изменения:

  1. Дал контексту сохранения то же имя, что и проект (не знаю, требуется ли это)
  2. В классе Main я изменил имя единицы персистентности на EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPATest");, потому что это имя я использовал.
  3. Файл persistence.xml перемещен в папку src/META-INF/.
  4. Добавлен поставщик постоянства
  5. Использовалась база данных HSQL, поэтому имя схемы было изменено на имя, созданное HSQLDB — в моем случае MyDB.
  6. В теге сохранения был один неправильный URL-адрес, который я удалил. Тот, у кого ../настойчивость/настойчивость

Вот именованные запросы в файле Professor.java, которые я изменил, чтобы посмотреть, смогу ли я воспроизвести вашу проблему:

    @NamedQueries({
  @NamedQuery(name="findProfessorsAboveSal",
              query="SELECT e " +
                    "FROM Professor e " +
                    "WHERE e.department = :dept AND " +
                    "      e.salary > :sal AND e.id IN(1000)"),
  @NamedQuery(name="replicateError", query="select e from Professor e where "+
"e.id in(select prj from Project prj where prj.id = ?1)")})

Вот мой измененный файл persistence.xml

    <?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> 
  <persistence-unit name="JPATest" transaction-type="RESOURCE_LOCAL">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
   <class>test.ProfessorService</class>
       <class>test.Professor</class>
       <class>test.Project</class>
       <class>test.Department</class>
       <class>test.JPAUtil</class>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
      <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
      <property name="hibernate.connection.username" value="sa"/>
      <property name="hibernate.connection.password" value=""/>
      <property name="hibernate.connection.url" value="jdbc:hsqldb:data/MyDB"/>
    </properties>
  </persistence-unit>
</persistence>

Наконец, я использовал эти банки:

    antlr-2.7.7.jar
asm-3.3.1.jar
cglib-2.2.jar
commons-collections-3.2.1.jar
commons-logging-1.1.1.jar
dom4j-1.6.1.jar
hibernate-3.2.6.ga.jar
hibernate-annotations-3.4.0.GA.jar
hibernate-commons-annotations-3.2.0.Final.jar
hibernate-core-3.6.5.Final.jar
hibernate-entitymanager-3.6.1.Final.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar
hsqldb-1.8.0.7.jar
javassist.jar
jta-1.1.jar
slf4j-api-1.5.8.jar
slf4j-jdk14-1.5.8.jar

Надеюсь это поможет.

person Teena George    schedule 05.06.2014
comment
Спасибо, после того, как я переделал его в соответствии с приведенным примером, он начал работать, я не уверен, чего не хватало, но теперь это так, как и ожидалось. Лучший, Хенрик - person Hiny; 05.06.2014

Вы пытались использовать setString вместо setParameter при создании запроса?

person Amir M    schedule 03.06.2014