# HG changeset patch # User Raimund Renkert # Date 1372338149 -7200 # Node ID bca4bda93a9873bfddff889eeccfc764731b33ab # Parent cfa61bb7a86fc73a2c50936462a1bb021176798d Added builder to have an easier interface for java persistence queries. diff -r cfa61bb7a86f -r bca4bda93a98 src/main/java/de/intevation/lada/data/QueryBuilder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/de/intevation/lada/data/QueryBuilder.java Thu Jun 27 15:02:29 2013 +0200 @@ -0,0 +1,116 @@ +package de.intevation.lada.data; + +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Order; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; + +public class QueryBuilder +{ + private EntityManager manager; + private CriteriaBuilder builder; + private CriteriaQuery query; + private Root root; + private Class clazz; + private Predicate filter; + + public QueryBuilder(EntityManager manager, Class clazz) { + this.manager = manager; + this.clazz = clazz; + this.builder = this.manager.getCriteriaBuilder(); + this.query = this.builder.createQuery(this.clazz); + this.root = this.query.from(this.clazz); + } + + public CriteriaQuery getQuery() { + this.query.where(this.filter); + return this.query; + } + + public QueryBuilder and(String id, String value) { + Predicate p = this.builder.equal(this.root.get(id), value); + if (this.filter != null) { + this.filter = this.builder.and(this.filter, p); + } + else { + this.filter = this.builder.and(p); + } + return this; + } + + public QueryBuilder or(String id, String value) { + Predicate p = this.builder.equal(this.root.get(id), value); + if (this.filter != null) { + this.filter = this.builder.or(this.filter, p); + } + else { + this.filter = this.builder.or(p); + } + return this; + } + + public QueryBuilder and(String id, List values) { + for(String v: values) { + this.and(id, v); + } + return this; + } + + public QueryBuilder or(String id, List values) { + for (String v: values) { + this.or(id, v); + } + return this; + } + + public QueryBuilder and(QueryBuilder b) { + if (b == null || b.filter == null) { + return this; + } + if (this.filter != null) { + this.filter = this.builder.and(this.filter, b.filter); + } + else { + this.filter = this.builder.and(b.filter); + } + return this; + } + + public QueryBuilder or(QueryBuilder b) { + if (b == null || b.filter == null) { + return this; + } + if (this.filter != null) { + this.filter = this.builder.or(this.filter, b.filter); + } + else { + this.filter = this.builder.or(b.filter); + } + return this; + } + + public void distinct() { + this.query.distinct(true); + } + + public void orderBy(String id, boolean asc) { + if (asc) { + this.query.orderBy(this.builder.asc(this.root.get(id))); + } + else { + this.query.orderBy(this.builder.desc(this.root.get(id))); + } + } + + public QueryBuilder getEmptyBuilder(){ + QueryBuilder copy = new QueryBuilder(manager, clazz); + copy.builder = this.builder; + copy.root = this.root; + return copy; + } +}