gpt4 book ai didi

java - jpql(NamedQuery)子查询不适用于参数

转载 作者:行者123 更新时间:2023-12-02 05:46:31 28 4
gpt4 key购买 nike

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

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

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

最好,亨里克

最佳答案

我无法重现您的问题。我得到了预期的结果。您可以发布更多代码吗?这是我测试并工作的代码。我从 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. 持久性标签有一个错误的网址,我已将其删除。具有../持久性/持久性的人

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

最后,我使用了这些 jar :

    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

希望这有帮助。

关于java - jpql(NamedQuery)子查询不适用于参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24015079/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com