From 65865cfb7890701cdf1f21b522ff62127f3d8561 Mon Sep 17 00:00:00 2001 From: Karsten Ludwig Hauser Date: Fri, 22 Feb 2019 16:41:46 +0100 Subject: [PATCH] we could also use set --- .../java/com/querydsl/jpa/JPQLSerializer.java | 19 +++++++++++-- .../jpa/hibernate/HibernateInsertClause.java | 28 +++++++++++++------ .../querydsl/jpa/impl/JPAInsertClause.java | 28 +++++++++++++------ 3 files changed, 57 insertions(+), 18 deletions(-) diff --git a/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java b/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java index 0c202d3f3..c7ddccf49 100644 --- a/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java +++ b/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java @@ -260,7 +260,7 @@ public class JPQLSerializer extends SerializerBase { } } - public void serializeForInsert(QueryMetadata md, List> columns, SubQueryExpression query) { + public void serializeForInsert(QueryMetadata md, List> columns, SubQueryExpression query, Map, Expression> inserts) { append(INSERT); JoinExpression je = md.getJoins().get(0); final EntityPath pe = (EntityPath) je.getTarget(); @@ -276,7 +276,22 @@ public class JPQLSerializer extends SerializerBase { first = false; } append(")\n"); - serialize(query.getMetadata(), false, null); + + if (inserts != null && inserts.entrySet().size() > 0) { + first = true; + for (Map.Entry, Expression> entry : inserts.entrySet()) { + if (!first) { + append(", "); + } + handle(entry.getKey()); + append(" = "); + handle(entry.getValue()); + first = false; + } + } + else { + serialize(query.getMetadata(), false, null); + } } public void serializeForUpdate(QueryMetadata md, Map, Expression> updates) { diff --git a/querydsl-jpa/src/main/java/com/querydsl/jpa/hibernate/HibernateInsertClause.java b/querydsl-jpa/src/main/java/com/querydsl/jpa/hibernate/HibernateInsertClause.java index ee2e62bfe..8afe76c64 100644 --- a/querydsl-jpa/src/main/java/com/querydsl/jpa/hibernate/HibernateInsertClause.java +++ b/querydsl-jpa/src/main/java/com/querydsl/jpa/hibernate/HibernateInsertClause.java @@ -24,6 +24,7 @@ import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.StatelessSession; +import com.google.common.collect.Maps; import com.querydsl.core.JoinType; import com.querydsl.core.dml.InsertClause; import com.querydsl.core.support.QueryMixin; @@ -31,6 +32,7 @@ import com.querydsl.core.types.EntityPath; import com.querydsl.core.types.Expression; import com.querydsl.core.types.Path; import com.querydsl.core.types.SubQueryExpression; +import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.HQLTemplates; import com.querydsl.jpa.JPAQueryMixin; import com.querydsl.jpa.JPQLSerializer; @@ -47,6 +49,8 @@ public class HibernateInsertClause implements private final QueryMixin queryMixin = new JPAQueryMixin(); + private final Map, Expression> inserts = Maps.newLinkedHashMap(); + private final List> columns = new ArrayList>(); private SubQueryExpression subQuery; @@ -79,7 +83,7 @@ public class HibernateInsertClause implements @Override public long execute() { JPQLSerializer serializer = new JPQLSerializer(templates, null); - serializer.serializeForInsert(queryMixin.getMetadata(), columns, subQuery); + serializer.serializeForInsert(queryMixin.getMetadata(), columns, subQuery, inserts); Map constants = serializer.getConstantToLabel(); Query query = session.createQuery(serializer.toString()); @@ -115,7 +119,7 @@ public class HibernateInsertClause implements @Override public String toString() { JPQLSerializer serializer = new JPQLSerializer(templates, null); - serializer.serializeForInsert(queryMixin.getMetadata(), columns, subQuery); + serializer.serializeForInsert(queryMixin.getMetadata(), columns, subQuery, inserts); return serializer.toString(); } @@ -126,20 +130,28 @@ public class HibernateInsertClause implements @Override public HibernateInsertClause set(Path path, T value) { - // TODO Auto-generated method stub - return null; + if (value != null) { + inserts.put(path, Expressions.constant(value)); + } else { + setNull(path); + } + return this; } @Override public HibernateInsertClause set(Path path, Expression expression) { - // TODO Auto-generated method stub - return null; + if (expression != null) { + inserts.put(path, expression); + } else { + setNull(path); + } + return this; } @Override public HibernateInsertClause setNull(Path path) { - // TODO Auto-generated method stub - return null; + inserts.put(path, Expressions.nullExpression(path)); + return this; } @Override diff --git a/querydsl-jpa/src/main/java/com/querydsl/jpa/impl/JPAInsertClause.java b/querydsl-jpa/src/main/java/com/querydsl/jpa/impl/JPAInsertClause.java index f4d6c4b5f..7b06b41e1 100644 --- a/querydsl-jpa/src/main/java/com/querydsl/jpa/impl/JPAInsertClause.java +++ b/querydsl-jpa/src/main/java/com/querydsl/jpa/impl/JPAInsertClause.java @@ -23,6 +23,7 @@ import javax.persistence.EntityManager; import javax.persistence.LockModeType; import javax.persistence.Query; +import com.google.common.collect.Maps; import com.querydsl.core.JoinType; import com.querydsl.core.dml.InsertClause; import com.querydsl.core.support.QueryMixin; @@ -30,6 +31,7 @@ import com.querydsl.core.types.EntityPath; import com.querydsl.core.types.Expression; import com.querydsl.core.types.Path; import com.querydsl.core.types.SubQueryExpression; +import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.JPAQueryMixin; import com.querydsl.jpa.JPQLSerializer; import com.querydsl.jpa.JPQLTemplates; @@ -46,6 +48,8 @@ public class JPAInsertClause implements InsertClause { private final List> columns = new ArrayList>(); + private final Map, Expression> inserts = Maps.newLinkedHashMap(); + private final List> values = new ArrayList>(); private final EntityManager entityManager; @@ -70,7 +74,7 @@ public class JPAInsertClause implements InsertClause { @Override public long execute() { JPQLSerializer serializer = new JPQLSerializer(templates, entityManager); - serializer.serializeForInsert(queryMixin.getMetadata(), columns, subQuery); + serializer.serializeForInsert(queryMixin.getMetadata(), columns, subQuery, inserts); Map constants = serializer.getConstantToLabel(); Query query = entityManager.createQuery(serializer.toString()); @@ -89,7 +93,7 @@ public class JPAInsertClause implements InsertClause { @Override public String toString() { JPQLSerializer serializer = new JPQLSerializer(templates, entityManager); - serializer.serializeForInsert(queryMixin.getMetadata(), columns, subQuery); + serializer.serializeForInsert(queryMixin.getMetadata(), columns, subQuery, inserts); return serializer.toString(); } @@ -119,20 +123,28 @@ public class JPAInsertClause implements InsertClause { @Override public JPAInsertClause set(Path path, T value) { - // TODO Auto-generated method stub - return null; + if (value != null) { + inserts.put(path, Expressions.constant(value)); + } else { + setNull(path); + } + return this; } @Override public JPAInsertClause set(Path path, Expression expression) { - // TODO Auto-generated method stub - return null; + if (expression != null) { + inserts.put(path, expression); + } else { + setNull(path); + } + return this; } @Override public JPAInsertClause setNull(Path path) { - // TODO Auto-generated method stub - return null; + inserts.put(path, Expressions.nullExpression(path)); + return this; } }