From 11cd526892baea8ad35571dd7153b7474f14315c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Tue, 23 Sep 2014 22:30:49 +0300 Subject: [PATCH] Improve in-operation handling --- .../com/mysema/query/jpa/JPQLSerializer.java | 28 +++++++------------ .../com/mysema/query/AbstractJPATest.java | 6 ++++ 2 files changed, 16 insertions(+), 18 deletions(-) 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 b92feff66..d0372da53 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 @@ -13,24 +13,12 @@ */ package com.mysema.query.jpa; -import java.util.ArrayList; -import java.util.Collection; -import java.util.EnumMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - import javax.annotation.Nullable; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; -import javax.persistence.EntityManager; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.PersistenceUnitUtil; +import javax.persistence.*; import javax.persistence.metamodel.EntityType; import javax.persistence.metamodel.Metamodel; import javax.persistence.metamodel.SingularAttribute; +import java.util.*; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -39,6 +27,7 @@ import com.mysema.query.JoinType; import com.mysema.query.QueryMetadata; import com.mysema.query.support.SerializerBase; import com.mysema.query.types.*; +import com.mysema.query.types.template.NumberTemplate; import com.mysema.util.MathUtils; /** @@ -427,10 +416,12 @@ public class JPQLSerializer extends SerializerBase { @SuppressWarnings({ "rawtypes", "unchecked" }) private void visitPathInCollection(Class type, Operator operator, List> args) { - // NOTE turns entityPath in collection into entityPath.id in (collection of ids) - if (entityManager != null && !templates.isPathInEntitiesSupported() && args.get(0).getType().isAnnotationPresent(Entity.class)) { - Path lhs = (Path) args.get(0); - Constant rhs = (Constant) args.get(1); + Path lhs = (Path) args.get(0); + Constant rhs = (Constant) args.get(1); + if (((Collection)rhs.getConstant()).isEmpty()) { + operator = Ops.EQ; + args = ImmutableList.of(NumberTemplate.ONE, NumberTemplate.TWO); + } else if (entityManager != null && !templates.isPathInEntitiesSupported() && args.get(0).getType().isAnnotationPresent(Entity.class)) { final Metamodel metamodel = entityManager.getMetamodel(); final PersistenceUnitUtil util = entityManager.getEntityManagerFactory().getPersistenceUnitUtil(); final EntityType entityType = metamodel.entity(args.get(0).getType()); @@ -447,6 +438,7 @@ public class JPQLSerializer extends SerializerBase { args = ImmutableList.of(lhs, rhs); } } + super.visitOperation(type, operator, args); } diff --git a/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java b/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java index ee5942429..61c6615a0 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java @@ -21,6 +21,7 @@ import java.util.Map.Entry; import antlr.RecognitionException; import antlr.TokenStreamException; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.mysema.commons.lang.Pair; import com.mysema.query.group.Group; @@ -708,6 +709,11 @@ public abstract class AbstractJPATest { query().from(cat).where(cat.kittens.any().in(savedCats)).count(); } + @Test + public void In8() { + assertEquals(0, query().from(cat).where(cat.name.in(ImmutableList.of())).count()); + } + @Test @IncludeIn(Target.H2) @NoBatooJPA