jpql(NamedQuery)子查询不使用参数
-
21-12-2019 - |
题
我正在使用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不太熟悉,但我看不到字符串vaule和参数值之间的区别,因为当我做diff时,它们是相同的。
logger.info("SenderName == {} ? {}", name, name.equals("SenderName"));
这返回"SenderName==SenderName?真"。..
最好的, 亨里克
解决方案
我无法重现你的问题。我得到了预期的结果。你能发布更多代码吗? 这是我测试和工作的代码。我从java2s获得了这个例子,以便快速设置。但它起初没有工作,所以我做了一些变化。 java2s命名Query example 我所做的改变是:
- 给出了持久性上下文与项目相同的名称(不知道是必需的)
- 在主类中,我将持久性单位的名称更改为生成扫描仪代码,因为这是我使用的名称。
- 将persistence.xml移动到
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPATest");
文件夹 - 添加持久性提供者
- 使用的hsql db,因此将架构名称更改为hsqldb - mydb在我的情况下创建的名称
- 持久性标记有一个错误的URL,我删除了。与...为持久性/持久性
这是教授.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)")})
.
这是我的修改效率.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
.
希望这有帮助。
其他提示
你有没有试过使用 setString
而不是 setParameter
当creatina g查询?
不隶属于 StackOverflow