【问题标题】:jpql (NamedQuery) subquery not working with parameterjpql(NamedQuery)子查询不使用参数
【发布时间】:2014-07-23 18:48:31
【问题描述】:

我正在使用 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 值和参数值之间的区别,因为当我进行 diff 时,它们是相同的。

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

这会返回“SenderName == SenderName ? true”...

最好, 亨里克

【问题讨论】:

  • 这里能调试一下name的值是什么 -->Query query = em.createNamedQuery("Entry.findAllForName").setParameter("name", name);
  • 是的,我也看到调试在说,找到参数'name'并将其设置为“SenderName”。

标签: java jpa jpql named-query


【解决方案1】:

您是否尝试过在创建查询时使用setString 而不是setParameter

【讨论】:

    【解决方案2】:

    我无法重现您的问题。我得到了预期的结果。你能发布更多代码吗? 这是我测试和工作的代码。我从 Java2s 获得了这个示例以进行快速设置。但它一开始没有用,所以我做了一些改变。 Java2s named query example 我所做的更改是:

    1. 为持久化上下文赋予与项目相同的名称(不知道是否需要)
    2. 在 Main 类中,我将持久化单元的名称更改为 EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPATest");,因为这是我使用的名称。
    3. 将 persistence.xml 移至 src/META-INF/ 文件夹
    4. 添加了持久性提供程序
    5. 使用 HSQL DB,因此将架构名称更改为由 HSQLDB 创建的名称 - 在我的情况下为 MyDB
    6. 持久性标签有一个错误的 URL,我将其删除。带有 ../persistence/persistence 的那个

    这是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
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢,按照提供的示例重做后,它开始工作,我不确定缺少什么,但现在符合预期。最好的,亨里克
    猜你喜欢
    • 2018-08-15
    • 1970-01-01
    • 2018-06-18
    • 2011-08-26
    • 2012-07-11
    • 1970-01-01
    • 2016-07-03
    • 2014-08-01
    • 1970-01-01
    相关资源
    最近更新 更多