Java 查询的JPA2和Hibernate 3.5.1成员不工作
我正在尝试以下JPQL,但它失败了:Java 查询的JPA2和Hibernate 3.5.1成员不工作,java,hibernate,orm,jpa,jpa-2.0,Java,Hibernate,Orm,Jpa,Jpa 2.0,我正在尝试以下JPQL,但它失败了: Query query = em.createQuery("SELECT u FROM User u WHERE 'admin' MEMBER OF u.roles"); List users = query.query.getResultList(); 我得到以下例外情况: ERROR [main] PARSER.error(454) | <AST>:0:0: unexpected end of subtree java.lang.Illeg
Query query = em.createQuery("SELECT u FROM User u WHERE 'admin' MEMBER OF u.roles");
List users = query.query.getResultList();
我得到以下例外情况:
ERROR [main] PARSER.error(454) | <AST>:0:0: unexpected end of subtree
java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: unexpected end of subtree [SELECT u FROM com.online.data.User u WHERE 'admin' MEMBER OF u.roles] ERROR [main] PARSER.error(454) | <AST>:0:0: expecting "from", found '<ASTNULL>'
...
...
Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected end of subtree [SELECT u FROM com.online.data.User u WHERE 'admin' MEMBER OF u.roles]
我认为的
成员不能与@ElementCollection
属性一起使用。您的查询在我看来非常好。作为记录,这是JPA 2.0规范关于
操作员的成员所写的内容:
4.6.13集合成员表达式
使用的语法
集合成员表达式中的比较运算符成员如下所示:
collection_member_expression ::=
entity_or_value_expression [NOT] MEMBER [OF] collection_valued_path_expression
entity_or_value_expression ::=
single_valued_object_path_expression |
state_field_path_expression |
simple_entity_or_value_expression
simple_entity_or_value_expression ::=
identification_variable |
input_parameter |
literal
此表达式测试指定值是否为
指定的集合
集合值路径表达式
计算为的表达式
中不支持可嵌入类型
集合成员表达式。支持
用于在集合中使用嵌入
成员表达式可以添加到
本规范的未来版本
如果集合的值为路径
表达式指定一个空的
集合,成员的值
表达式的值为FALSE
且
表达式的非成员的
TRUE
。否则,如果
集合成员表达式中的集合\值\路径\表达式或实体\或\值\表达式为空
或未知,则为
集合成员表达式为
不知道
例如:
SELECT p
FROM Person p
WHERE 'Joe' MEMBER OF p.nicknames
因此,因为我看不出您的查询中有任何错误,所以我用EclipseLink测试了您的代码,下面的代码片段很有效:
Query query = em.createQuery("SELECT u FROM User u WHERE 'admin' MEMBER OF u.roles");
List list = query.getResultList();
但Hibernate EntityManager 3.5.1-Final确实失败了。这听起来像一个错误,请随意提出
1为了以防万一,我使用了以下Maven配置文件(针对JPA提供商):
更新:中报告了您的查询是绝对正确的,应该可以正常工作。就在今天,我遇到了同样的问题,多亏了这篇文章,我才能够不再把头撞到墙上
由于@ElementCollection确实是具有内在关联的连接元素的一个很好的快捷方式,因此您仍然可以在查询中使用连接语义
为了更好地表达这一点,您需要加入您的收藏,并在where中设置一个条件
把它变成更具体的东西
您的查询:
SELECT u FROM User u WHERE 'admin' MEMBER OF u.roles
可以写为:
SELECT u FROM User u JOIN u.roles r WHERE r = 'admin'
希望这有帮助 ,
作为解决方法,请使用以下语法:
select user from User user where :role in elements(user.roles)
规范中没有类似的内容。
的成员应该在集合上工作(它确实这样做了),而不管使用了什么注释。感谢您的更正。还没有机会研究这个规范,这只是一个猜测。JPA规范中有很多东西,但是Hibernate不支持它。围绕Hibernate构建的应用程序服务器如何能够通过Java EE认证?谢谢,我只是觉得我疯了。@Ed_Zero你显然不是:)如果你创建了一个问题,请用指向Jira问题的链接更新这个问题,好吗?提前感谢。感谢您的解决方案。。。你能给我指出is[not]empty运算符的解决方法吗?
SELECT p
FROM Person p
WHERE 'Joe' MEMBER OF p.nicknames
Query query = em.createQuery("SELECT u FROM User u WHERE 'admin' MEMBER OF u.roles");
List list = query.getResultList();
<profile>
<id>eclipselink</id>
<repositories>
<repository>
<id>eclipselink</id>
<url>http://www.eclipse.org/downloads/download.php?r=1&nf=1&file=/rt/eclipselink/maven.repo/</url>
</repository>
</repositories>
<dependencies>
<!-- See http://wiki.eclipse.org/EclipseLink/Maven -->
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.0.0</version>
</dependency>
<!-- optional - only needed if you are using JPA outside of a Java EE container-->
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>javax.persistence</artifactId>
<version>2.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</profile>
<?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_2_0.xsd"
version="2.0">
<persistence-unit name="TestPu" transaction-type="RESOURCE_LOCAL">
<class>com.stackoverflow.q2688144.User</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:derby:testdb;create=true"/>
<property name="eclipselink.target-database" value="DERBY"/>
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
</properties>
</persistence-unit>
</persistence>
SELECT u FROM User u WHERE 'admin' MEMBER OF u.roles
SELECT u FROM User u JOIN u.roles r WHERE r = 'admin'
select user from User user where :role in elements(user.roles)