Fix delete with any serialization

This commit is contained in:
Timo Westkämper 2014-09-29 21:57:55 +03:00
parent 23e68a7d6d
commit d1af71b460
5 changed files with 70 additions and 73 deletions

View File

@ -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<HibernateDeleteClause> {
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<HibernateDeleteClause
public HibernateDeleteClause(SessionHolder session, EntityPath<?> 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<Object,String> constants = serializer.getConstantToLabel();
Query query = session.createQuery(serializer.toString());
for (Map.Entry<Path<?>, 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<HibernateDeleteClause
@Override
public String toString() {
JPQLSerializer serializer = new JPQLSerializer(templates, null);
serializer.serializeForDelete(md);
serializer.serializeForDelete(queryMixin.getMetadata());
return serializer.toString();
}

View File

@ -17,25 +17,19 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.mysema.query.JoinType;
import com.mysema.query.dml.UpdateClause;
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.*;
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.UpdateClause;
import com.mysema.query.jpa.HQLTemplates;
import com.mysema.query.jpa.JPQLSerializer;
import com.mysema.query.jpa.JPQLTemplates;
import com.mysema.query.types.EntityPath;
import com.mysema.query.types.Expression;
import com.mysema.query.types.ExpressionUtils;
import com.mysema.query.types.NullExpression;
import com.mysema.query.types.Path;
import com.mysema.query.types.Predicate;
/**
* UpdateClause implementation for Hibernate
*
@ -45,7 +39,7 @@ import com.mysema.query.types.Predicate;
public class HibernateUpdateClause implements
UpdateClause<HibernateUpdateClause> {
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<Object, String> constants = serializer.getConstantToLabel();
Query query = session.createQuery(serializer.toString());
for (Map.Entry<Path<?>, 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 <T> HibernateUpdateClause set(Path<T> 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 <T> HibernateUpdateClause set(Path<T> path, Expression<? extends T> 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 <T> HibernateUpdateClause setNull(Path<T> path) {
metadata.addProjection(ExpressionUtils.eq(path, new NullExpression<T>(path.getType())));
queryMixin.addProjection(ExpressionUtils.eq(path, new NullExpression<T>(path.getType())));
return this;
}
@ -117,9 +111,9 @@ public class HibernateUpdateClause implements
public HibernateUpdateClause set(List<? extends Path<?>> 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();
}

View File

@ -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<JPADeleteClause> {
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<JPADeleteClause> {
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<Object,String> 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<JPADeleteClause> {
@Override
public String toString() {
JPQLSerializer serializer = new JPQLSerializer(templates, entityManager);
serializer.serializeForDelete(metadata);
serializer.serializeForDelete(queryMixin.getMetadata());
return serializer.toString();
}

View File

@ -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<JPAUpdateClause> {
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<JPAUpdateClause> {
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<Object,String> 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 <T> JPAUpdateClause set(Path<T> 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<JPAUpdateClause> {
@Override
public <T> JPAUpdateClause set(Path<T> path, Expression<? extends T> 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<JPAUpdateClause> {
@Override
public <T> JPAUpdateClause setNull(Path<T> path) {
metadata.addProjection(ExpressionUtils.eq(path, new NullExpression<T>(path.getType())));
queryMixin.addProjection(ExpressionUtils.eq(path, new NullExpression<T>(path.getType())));
return this;
}
@ -100,9 +100,9 @@ public class JPAUpdateClause implements UpdateClause<JPAUpdateClause> {
public JPAUpdateClause set(List<? extends Path<?>> 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<JPAUpdateClause> {
@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<JPAUpdateClause> {
@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();
}
}

View File

@ -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)