mirror of
https://github.com/querydsl/querydsl.git
synced 2026-06-27 21:01:15 +08:00
Fix delete with any serialization
This commit is contained in:
parent
23e68a7d6d
commit
d1af71b460
@ -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();
|
||||
}
|
||||
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user