Permalink
Browse files

HHH-5209 - org.hibernate.hql.ast.QuerySyntaxException when running a …

…JPQL query with a MEMBER OF on an @ElementCollection
  • Loading branch information...
1 parent 4152ff6 commit 199ee7860ebec5adbcb419d454634f47e24ff8c0 @sebersole sebersole committed Oct 3, 2012
@@ -383,11 +383,15 @@ public void handleDotIdent() throws TokenStreamException {
@Override
public void processMemberOf(Token n, AST p, ASTPair currentAST) {
- AST inAst = n == null ? astFactory.create( IN, "in" ) : astFactory.create( NOT_IN, "not in" );
- astFactory.makeASTRoot( currentAST, inAst );
- AST ast = createSubquery( p );
- ast = ASTUtil.createParent( astFactory, IN_LIST, "inList", ast );
- inAst.addChild( ast );
+ // convert MEMBER OF to the equivalent IN ELEMENTS structure...
+ AST inNode = n == null ? astFactory.create( IN, "in" ) : astFactory.create( NOT_IN, "not in" );
+ astFactory.makeASTRoot( currentAST, inNode );
+
+ AST inListNode = astFactory.create( IN_LIST, "inList" );
+ inNode.addChild( inListNode );
+ AST elementsNode = astFactory.create( ELEMENTS, "elements" );
+ inListNode.addChild( elementsNode );
+ elementsNode.addChild( p );
}
static public void panic() {
@@ -0,0 +1,57 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2012, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.test.annotations.collectionelement;
+
+import javax.persistence.ElementCollection;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Steve Ebersole
+ */
+@Entity
+public class EntityWithAnElementCollection {
+ private Long id;
+ private Set<String> someStrings = new HashSet<String>();
+
+ @Id
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @ElementCollection
+ public Set<String> getSomeStrings() {
+ return someStrings;
+ }
+
+ public void setSomeStrings(Set<String> someStrings) {
+ this.someStrings = someStrings;
+ }
+}
@@ -0,0 +1,51 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2012, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.test.annotations.collectionelement;
+
+import org.hibernate.Session;
+
+import org.junit.Test;
+
+import org.hibernate.testing.TestForIssue;
+import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
+
+/**
+ * @author Steve Ebersole
+ */
+public class QueryTest extends BaseCoreFunctionalTestCase {
+ @Override
+ protected Class<?>[] getAnnotatedClasses() {
+ return new Class[] { EntityWithAnElementCollection.class };
+ }
+
+ @Test
+ @TestForIssue( jiraKey = "HHH-5209" )
+ public void testMemberOfSyntax() {
+ // performs syntax checking of the MEMBER OF predicate against a basic collection
+ Session s = openSession();
+// s.createQuery( "from EntityWithAnElementCollection e where 'abc' in elements( e.someStrings )" ).list();
+ s.createQuery( "from EntityWithAnElementCollection e where 'abc' member of e.someStrings" ).list();
+ s.close();
+ }
+}

0 comments on commit 199ee78

Please sign in to comment.