Java 查询的JPA2和Hibernate 3.5.1成员不工作

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

我正在尝试以下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.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&amp;nf=1&amp;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)