From c497cece3c7e808073e7bfd15d2ed68214b57bc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Tue, 5 Jul 2011 09:37:37 +0000 Subject: [PATCH] #800698 : fixed enum in path handling for Hibernate --- .../com/mysema/query/jpa/HQLTemplates.java | 6 +++++ .../com/mysema/query/jpa/JPQLSerializer.java | 12 ++++++++++ .../com/mysema/query/jpa/JPQLTemplates.java | 4 ++++ .../mysema/query/AbstractStandardTest.java | 13 +++++++++++ .../query/_derby/DerbyJPAEclipseLinkTest.java | 4 +++- .../com/mysema/query/jpa/domain/Employee.java | 22 +++++++++++++++---- .../mysema/query/jpa/domain/JobFunction.java | 7 ++++++ 7 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 querydsl-jpa/src/test/java/com/mysema/query/jpa/domain/JobFunction.java diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/HQLTemplates.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/HQLTemplates.java index b5699788b..4ed3896c0 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/HQLTemplates.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/HQLTemplates.java @@ -77,4 +77,10 @@ public class HQLTemplates extends JPQLTemplates{ return "1"; } + @Override + public boolean isEnumInPathSupported() { + // related : http://opensource.atlassian.com/projects/hibernate/browse/HHH-5159 + return false; + } + } diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java index 0dbb60293..f84437aa8 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLSerializer.java @@ -17,6 +17,8 @@ import java.util.Set; import javax.annotation.Nullable; import javax.persistence.DiscriminatorValue; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; import com.mysema.query.JoinExpression; import com.mysema.query.JoinType; @@ -276,6 +278,16 @@ public class JPQLSerializer extends SerializerBase { if (operator.equals(Ops.IN)){ if (args.get(1) instanceof Path){ + if (!templates.isEnumInPathSupported() && args.get(0) instanceof Constant && Enum.class.isAssignableFrom(args.get(0).getType())) { + Enumerated enumerated = ((Path)args.get(1)).getAnnotatedElement().getAnnotation(Enumerated.class); + Enum constant = (Enum)((Constant)args.get(0)).getConstant(); + if (enumerated == null || enumerated.value() == EnumType.ORDINAL) { + args = Arrays.asList(new ConstantImpl(constant.ordinal()), args.get(1)); + } else { + args = Arrays.asList(new ConstantImpl(constant.name()), args.get(1)); + } + } + super.visitOperation(type, JPQLTemplates.MEMBER_OF, args); }else{ super.visitOperation(type, operator, args); diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLTemplates.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLTemplates.java index 31de124a2..21e85be62 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLTemplates.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPQLTemplates.java @@ -115,6 +115,10 @@ public class JPQLTemplates extends Templates { // TODO : get rid of this when Hibernate supports type(alias) return false; } + + public boolean isEnumInPathSupported() { + return true; + } @Nullable public String getExistsProjection(){ diff --git a/querydsl-jpa/src/test/java/com/mysema/query/AbstractStandardTest.java b/querydsl-jpa/src/test/java/com/mysema/query/AbstractStandardTest.java index abb9776e3..1ad4a7854 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/AbstractStandardTest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/AbstractStandardTest.java @@ -29,6 +29,8 @@ import com.mysema.query.jpa.JPQLQuery; import com.mysema.query.jpa.JPQLSubQuery; import com.mysema.query.jpa.domain.Cat; import com.mysema.query.jpa.domain.DomesticCat; +import com.mysema.query.jpa.domain.Employee; +import com.mysema.query.jpa.domain.JobFunction; import com.mysema.query.jpa.domain.QCat; import com.mysema.query.jpa.domain.QEmployee; import com.mysema.query.jpa.domain.QShow; @@ -165,6 +167,10 @@ public abstract class AbstractStandardTest { show.acts.put("a","A"); show.acts.put("b","B"); save(show); + + Employee employee = new Employee(); + employee.jobFunctions.add(JobFunction.CODER); + save(employee); } @Test @@ -489,5 +495,12 @@ public abstract class AbstractStandardTest { query.innerJoin(QEmployee.employee.user, QUser.user); query.list(QEmployee.employee); } + + @Test + public void Enum_In() { + JPQLQuery query = query(); + query.from(QEmployee.employee).where(QEmployee.employee.jobFunctions.contains(JobFunction.CODER)); + assertEquals(1l, query.count()); + } } diff --git a/querydsl-jpa/src/test/java/com/mysema/query/_derby/DerbyJPAEclipseLinkTest.java b/querydsl-jpa/src/test/java/com/mysema/query/_derby/DerbyJPAEclipseLinkTest.java index ba209a2be..f95d5fcca 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/_derby/DerbyJPAEclipseLinkTest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/_derby/DerbyJPAEclipseLinkTest.java @@ -5,6 +5,7 @@ */ package com.mysema.query._derby; +import org.junit.Ignore; import org.junit.runner.RunWith; import com.mysema.query.AbstractJPATest; @@ -18,9 +19,10 @@ import com.mysema.testutil.JPATestRunner; * @author tiwe * */ +@Ignore @RunWith(JPATestRunner.class) @JPAConfig("derby-eclipselink") -public abstract class DerbyJPAEclipseLinkTest extends AbstractJPATest{ +public class DerbyJPAEclipseLinkTest extends AbstractJPATest{ @Override protected JPQLTemplates getTemplates(){ diff --git a/querydsl-jpa/src/test/java/com/mysema/query/jpa/domain/Employee.java b/querydsl-jpa/src/test/java/com/mysema/query/jpa/domain/Employee.java index a8d2d6f17..3cbea27b4 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/jpa/domain/Employee.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/jpa/domain/Employee.java @@ -5,7 +5,15 @@ */ package com.mysema.query.jpa.domain; +import java.util.Collection; +import java.util.HashSet; + +import javax.persistence.Column; +import javax.persistence.ElementCollection; import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; @@ -16,13 +24,19 @@ import javax.persistence.OneToOne; @Entity public class Employee { @ManyToOne - Company company; + public Company company; @OneToOne - User user; + public User user; - String firstName, lastName; + public String firstName, lastName; @Id - int id; + public int id; + + @Enumerated(EnumType.STRING) + @Column(name = "jobfunction") + @ElementCollection (fetch = FetchType.EAGER) + public Collection jobFunctions = new HashSet(); + } diff --git a/querydsl-jpa/src/test/java/com/mysema/query/jpa/domain/JobFunction.java b/querydsl-jpa/src/test/java/com/mysema/query/jpa/domain/JobFunction.java new file mode 100644 index 000000000..c8d011d56 --- /dev/null +++ b/querydsl-jpa/src/test/java/com/mysema/query/jpa/domain/JobFunction.java @@ -0,0 +1,7 @@ +package com.mysema.query.jpa.domain; + +public enum JobFunction { + + MANAGER, CODER, CONSULTANT, CONTROLLER; + +} \ No newline at end of file