From d1af71b4603a910e49c8176da10c8003687d31e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Mon, 29 Sep 2014 21:57:55 +0300 Subject: [PATCH] Fix delete with any serialization --- .../jpa/hibernate/HibernateDeleteClause.java | 31 ++++++------- .../jpa/hibernate/HibernateUpdateClause.java | 46 ++++++++----------- .../query/jpa/impl/JPADeleteClause.java | 16 +++---- .../query/jpa/impl/JPAUpdateClause.java | 28 +++++------ .../test/java/com/mysema/query/JPABase.java | 22 +++++---- 5 files changed, 70 insertions(+), 73 deletions(-) diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/HibernateDeleteClause.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/HibernateDeleteClause.java index 73eb28c90..5aea7b41e 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/HibernateDeleteClause.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/HibernateDeleteClause.java @@ -16,22 +16,21 @@ package com.mysema.query.jpa.hibernate; import java.util.HashMap; import java.util.Map; +import com.mysema.query.JoinType; +import com.mysema.query.dml.DeleteClause; +import com.mysema.query.jpa.HQLTemplates; +import com.mysema.query.jpa.JPAQueryMixin; +import com.mysema.query.jpa.JPQLSerializer; +import com.mysema.query.jpa.JPQLTemplates; +import com.mysema.query.support.QueryMixin; +import com.mysema.query.types.EntityPath; import com.mysema.query.types.Path; +import com.mysema.query.types.Predicate; import org.hibernate.LockMode; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.StatelessSession; -import com.mysema.query.DefaultQueryMetadata; -import com.mysema.query.JoinType; -import com.mysema.query.QueryMetadata; -import com.mysema.query.dml.DeleteClause; -import com.mysema.query.jpa.JPQLSerializer; -import com.mysema.query.jpa.HQLTemplates; -import com.mysema.query.jpa.JPQLTemplates; -import com.mysema.query.types.EntityPath; -import com.mysema.query.types.Predicate; - /** * DeleteClause implementation for Hibernate * @@ -40,7 +39,7 @@ import com.mysema.query.types.Predicate; */ public class HibernateDeleteClause implements DeleteClause { - private final QueryMetadata md = new DefaultQueryMetadata(); + private final QueryMixin queryMixin = new JPAQueryMixin(); private final SessionHolder session; @@ -63,27 +62,27 @@ public class HibernateDeleteClause implements DeleteClause entity, JPQLTemplates templates) { this.session = session; this.templates = templates; - md.addJoin(JoinType.DEFAULT, entity); + queryMixin.addJoin(JoinType.DEFAULT, entity); } @Override public long execute() { JPQLSerializer serializer = new JPQLSerializer(templates, null); - serializer.serializeForDelete(md); + serializer.serializeForDelete(queryMixin.getMetadata()); Map constants = serializer.getConstantToLabel(); Query query = session.createQuery(serializer.toString()); for (Map.Entry, LockMode> entry : lockModes.entrySet()) { query.setLockMode(entry.getKey().toString(), entry.getValue()); } - HibernateUtil.setConstants(query, constants, md.getParams()); + HibernateUtil.setConstants(query, constants, queryMixin.getMetadata().getParams()); return query.executeUpdate(); } @Override public HibernateDeleteClause where(Predicate... o) { for (Predicate p : o) { - md.addWhere(p); + queryMixin.where(p); } return this; } @@ -100,7 +99,7 @@ public class HibernateDeleteClause implements DeleteClause { - private final QueryMetadata metadata = new DefaultQueryMetadata(); + private final QueryMixin queryMixin = new JPAQueryMixin(); private final SessionHolder session; @@ -69,27 +63,27 @@ public class HibernateUpdateClause implements JPQLTemplates templates) { this.session = session; this.templates = templates; - metadata.addJoin(JoinType.DEFAULT, entity); + queryMixin.addJoin(JoinType.DEFAULT, entity); } @Override public long execute() { JPQLSerializer serializer = new JPQLSerializer(templates, null); - serializer.serializeForUpdate(metadata); + serializer.serializeForUpdate(queryMixin.getMetadata()); Map constants = serializer.getConstantToLabel(); Query query = session.createQuery(serializer.toString()); for (Map.Entry, LockMode> entry : lockModes.entrySet()) { query.setLockMode(entry.getKey().toString(), entry.getValue()); } - HibernateUtil.setConstants(query, constants, metadata.getParams()); + HibernateUtil.setConstants(query, constants, queryMixin.getMetadata().getParams()); return query.executeUpdate(); } @Override public HibernateUpdateClause set(Path path, T value) { if (value != null) { - metadata.addProjection(ExpressionUtils.eqConst(path, value)); + queryMixin.addProjection(ExpressionUtils.eqConst(path, value)); } else { setNull(path); } @@ -99,7 +93,7 @@ public class HibernateUpdateClause implements @Override public HibernateUpdateClause set(Path path, Expression expression) { if (expression != null) { - metadata.addProjection(ExpressionUtils.eq(path, expression)); + queryMixin.addProjection(ExpressionUtils.eq(path, expression)); } else { setNull(path); } @@ -108,7 +102,7 @@ public class HibernateUpdateClause implements @Override public HibernateUpdateClause setNull(Path path) { - metadata.addProjection(ExpressionUtils.eq(path, new NullExpression(path.getType()))); + queryMixin.addProjection(ExpressionUtils.eq(path, new NullExpression(path.getType()))); return this; } @@ -117,9 +111,9 @@ public class HibernateUpdateClause implements public HibernateUpdateClause set(List> paths, List values) { for (int i = 0; i < paths.size(); i++) { if (values.get(i) != null) { - metadata.addProjection(ExpressionUtils.eqConst((Expression)paths.get(i), values.get(i))); + queryMixin.addProjection(ExpressionUtils.eqConst((Expression)paths.get(i), values.get(i))); } else { - metadata.addProjection(ExpressionUtils.eq(((Expression)paths.get(i)), + queryMixin.addProjection(ExpressionUtils.eq(((Expression)paths.get(i)), new NullExpression(paths.get(i).getType()))); } @@ -130,7 +124,7 @@ public class HibernateUpdateClause implements @Override public HibernateUpdateClause where(Predicate... o) { for (Predicate p : o) { - metadata.addWhere(p); + queryMixin.where(p); } return this; } @@ -147,13 +141,13 @@ public class HibernateUpdateClause implements @Override public String toString() { JPQLSerializer serializer = new JPQLSerializer(templates, null); - serializer.serializeForUpdate(metadata); + serializer.serializeForUpdate(queryMixin.getMetadata()); return serializer.toString(); } @Override public boolean isEmpty() { - return metadata.getProjection().isEmpty(); + return queryMixin.getMetadata().getProjection().isEmpty(); } diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPADeleteClause.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPADeleteClause.java index 2bfeea552..38b4b384a 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPADeleteClause.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPADeleteClause.java @@ -19,12 +19,12 @@ import javax.persistence.LockModeType; import javax.persistence.Query; import java.util.Map; -import com.mysema.query.DefaultQueryMetadata; import com.mysema.query.JoinType; -import com.mysema.query.QueryMetadata; import com.mysema.query.dml.DeleteClause; +import com.mysema.query.jpa.JPAQueryMixin; import com.mysema.query.jpa.JPQLSerializer; import com.mysema.query.jpa.JPQLTemplates; +import com.mysema.query.support.QueryMixin; import com.mysema.query.types.EntityPath; import com.mysema.query.types.Predicate; @@ -36,7 +36,7 @@ import com.mysema.query.types.Predicate; */ public class JPADeleteClause implements DeleteClause { - private final QueryMetadata metadata = new DefaultQueryMetadata(); + private final QueryMixin queryMixin = new JPAQueryMixin(); private final EntityManager entityManager; @@ -52,27 +52,27 @@ public class JPADeleteClause implements DeleteClause { public JPADeleteClause(EntityManager entityManager, EntityPath entity, JPQLTemplates templates) { this.entityManager = entityManager; this.templates = templates; - metadata.addJoin(JoinType.DEFAULT, entity); + queryMixin.addJoin(JoinType.DEFAULT, entity); } @Override public long execute() { JPQLSerializer serializer = new JPQLSerializer(templates, entityManager); - serializer.serializeForDelete(metadata); + serializer.serializeForDelete(queryMixin.getMetadata()); Map constants = serializer.getConstantToLabel(); Query query = entityManager.createQuery(serializer.toString()); if (lockMode != null) { query.setLockMode(lockMode); } - JPAUtil.setConstants(query, constants, metadata.getParams()); + JPAUtil.setConstants(query, constants, queryMixin.getMetadata().getParams()); return query.executeUpdate(); } @Override public JPADeleteClause where(Predicate... o) { for (Predicate p : o) { - metadata.addWhere(p); + queryMixin.where(p); } return this; } @@ -85,7 +85,7 @@ public class JPADeleteClause implements DeleteClause { @Override public String toString() { JPQLSerializer serializer = new JPQLSerializer(templates, entityManager); - serializer.serializeForDelete(metadata); + serializer.serializeForDelete(queryMixin.getMetadata()); return serializer.toString(); } diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAUpdateClause.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAUpdateClause.java index e5bb32e43..2851d6f86 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAUpdateClause.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/JPAUpdateClause.java @@ -20,12 +20,12 @@ import javax.persistence.Query; import java.util.List; import java.util.Map; -import com.mysema.query.DefaultQueryMetadata; import com.mysema.query.JoinType; -import com.mysema.query.QueryMetadata; import com.mysema.query.dml.UpdateClause; +import com.mysema.query.jpa.JPAQueryMixin; import com.mysema.query.jpa.JPQLSerializer; import com.mysema.query.jpa.JPQLTemplates; +import com.mysema.query.support.QueryMixin; import com.mysema.query.types.*; /** @@ -36,7 +36,7 @@ import com.mysema.query.types.*; */ public class JPAUpdateClause implements UpdateClause { - private final QueryMetadata metadata = new DefaultQueryMetadata(); + private final QueryMixin queryMixin = new JPAQueryMixin(); private final EntityManager entityManager; @@ -52,27 +52,27 @@ public class JPAUpdateClause implements UpdateClause { public JPAUpdateClause(EntityManager em, EntityPath entity, JPQLTemplates templates) { this.entityManager = em; this.templates = templates; - metadata.addJoin(JoinType.DEFAULT, entity); + queryMixin.addJoin(JoinType.DEFAULT, entity); } @Override public long execute() { JPQLSerializer serializer = new JPQLSerializer(templates, entityManager); - serializer.serializeForUpdate(metadata); + serializer.serializeForUpdate(queryMixin.getMetadata()); Map constants = serializer.getConstantToLabel(); Query query = entityManager.createQuery(serializer.toString()); if (lockMode != null) { query.setLockMode(lockMode); } - JPAUtil.setConstants(query, constants, metadata.getParams()); + JPAUtil.setConstants(query, constants, queryMixin.getMetadata().getParams()); return query.executeUpdate(); } @Override public JPAUpdateClause set(Path path, T value) { if (value != null) { - metadata.addProjection(ExpressionUtils.eqConst(path, value)); + queryMixin.addProjection(ExpressionUtils.eqConst(path, value)); } else { setNull(path); } @@ -82,7 +82,7 @@ public class JPAUpdateClause implements UpdateClause { @Override public JPAUpdateClause set(Path path, Expression expression) { if (expression != null) { - metadata.addProjection(ExpressionUtils.eq(path, expression)); + queryMixin.addProjection(ExpressionUtils.eq(path, expression)); } else { setNull(path); } @@ -91,7 +91,7 @@ public class JPAUpdateClause implements UpdateClause { @Override public JPAUpdateClause setNull(Path path) { - metadata.addProjection(ExpressionUtils.eq(path, new NullExpression(path.getType()))); + queryMixin.addProjection(ExpressionUtils.eq(path, new NullExpression(path.getType()))); return this; } @@ -100,9 +100,9 @@ public class JPAUpdateClause implements UpdateClause { public JPAUpdateClause set(List> paths, List values) { for (int i = 0; i < paths.size(); i++) { if (values.get(i) != null) { - metadata.addProjection(ExpressionUtils.eqConst((Expression)paths.get(i), values.get(i))); + queryMixin.addProjection(ExpressionUtils.eqConst((Expression)paths.get(i), values.get(i))); } else { - metadata.addProjection(ExpressionUtils.eq((Expression)paths.get(i), + queryMixin.addProjection(ExpressionUtils.eq((Expression)paths.get(i), new NullExpression(paths.get(i).getType()))); } } @@ -112,7 +112,7 @@ public class JPAUpdateClause implements UpdateClause { @Override public JPAUpdateClause where(Predicate... o) { for (Predicate p : o) { - metadata.addWhere(p); + queryMixin.where(p); } return this; } @@ -125,13 +125,13 @@ public class JPAUpdateClause implements UpdateClause { @Override public String toString() { JPQLSerializer serializer = new JPQLSerializer(templates, entityManager); - serializer.serializeForUpdate(metadata); + serializer.serializeForUpdate(queryMixin.getMetadata()); return serializer.toString(); } @Override public boolean isEmpty() { - return metadata.getProjection().isEmpty(); + return queryMixin.getMetadata().getProjection().isEmpty(); } } diff --git a/querydsl-jpa/src/test/java/com/mysema/query/JPABase.java b/querydsl-jpa/src/test/java/com/mysema/query/JPABase.java index 84786d2e8..0bd0d6cd9 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/JPABase.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/JPABase.java @@ -13,6 +13,14 @@ */ package com.mysema.query; +import javax.persistence.EntityManager; +import javax.persistence.FlushModeType; +import javax.persistence.LockModeType; +import java.sql.Connection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import com.mysema.commons.lang.CloseableIterator; import com.mysema.query.jpa.JPASubQuery; import com.mysema.query.jpa.domain.*; @@ -27,15 +35,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.MethodRule; import org.junit.runner.RunWith; - -import javax.persistence.EntityManager; -import javax.persistence.FlushModeType; -import javax.persistence.LockModeType; -import java.sql.Connection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import static org.junit.Assert.*; /** @@ -98,6 +97,11 @@ public class JPABase extends AbstractJPATest { delete(cat).where(cat.name.eq("XXX")).execute(); } + @Test + public void Delete_Where_Any() { + delete(cat).where(cat.kittens.any().name.eq("XXX")).execute(); + } + @Test @NoBatooJPA @ExcludeIn(Target.MYSQL)