java方法criterion_java – JPA Criteria谓词条件
首先,您必須考慮以分層方式重新構建應用程序.您至少需要3層,DAO,服務和WebService.
有關數據庫和JPA的所有內容都必須位于DAO層中.所有與json相關的東西都必須在你的WebService層中.您的服務層必須管理Web服務和dao層之間的事務和通信.
首先,我們來談談您的Web服務層.您的JSON對象可能來自Restful Web服務.由于幾乎所有框架都支持json編組/解組,因此手動解析數據傳輸對象是不明智的.我的意思是,你可能更喜歡聲明一個FieldDto類并傳遞它的實例而不是JSONObject.這是FieldDto的一個例子.這是一個POJO.
public class FieldDto {
private String prodId;
private String prodName;
// Getters & Setters etc.
}
您可以使用GSON或Jackson輕松地對json進行編組/解組.可能你的框架默認使用其中一個來處理json轉換.
下一層是服務層.在服務層中,您可以管理事務并將DTO對象轉換為DAO層可以輕松理解的對象.在這種情況下,您的服務層將fieldDto.getProdId()和fielDto.getProdName()傳遞給DAO層.
你的最后一層是DAO層.首先讓我們改變您的方法簽名.
public List getProducts(String prodId, String prodName) {
CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Product.class);
Root root = criteriaQuery.from(Product.class);
List p = new ArrayList ();
if(prodId != null){
p.add(criteriaBuilder.like(root.get(Product_.prodId),prodId));
}
if(prodName != null){
p.add(criteriaBuilder.like(root.get(Product_.prodName), prodName));
}
if(!p.isEmpty()){
Predicate[] pr = new Predicate[p.size()];
p.toArray(pr);
criteriaQuery.where(pr);
}
return getEntityManager().createQuery(criteriaQuery).getResultList();
}
這不是它.此代碼仍需改進.在我的一個項目中,我創建了一個流暢的api來管理所有的樣板部件.當你開始編寫其他DAO類時,你會發現一些代碼塊一遍又一遍地重復.
這是一個流暢的api的例子.您可能想要構建它的版本.
import javax.persistence.EntityManager;
import javax.persistence.LockModeType;
import javax.persistence.PersistenceException;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.*;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.CollectionAttribute;
import javax.persistence.metamodel.PluralAttribute;
import javax.persistence.metamodel.SingularAttribute;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Vector;
public final class SimpleSelectBuilder {
private final EntityManager entityManager;
private final CriteriaBuilder criteriaBuilder;
private final CriteriaQuery criteriaQuery;
private final Root root;
private final Collection predicates;
private Integer first = null;
private Integer max = null;
private LockModeType lockModeType = null;
public SimpleSelectBuilder(final EntityManager entityManager, final Class entityClazz) {
this.entityManager = entityManager;
this.criteriaBuilder = entityManager.getCriteriaBuilder();
this.criteriaQuery = this.criteriaBuilder.createQuery(entityClazz);
this.root = criteriaQuery.from(entityClazz);
this.predicates = new Vector<>();
}
public SimpleSelectBuilder and(final Attribute attribute, final Object value) {
final Expression expression = this.getExpression(attribute, root);
this.predicates.add(criteriaBuilder.equal(expression, value));
return this;
}
public SimpleSelectBuilder andNotIn(final Attribute attribute, final Collection values) {
final Expression expression = this.getExpression(attribute, root);
this.predicates.add(criteriaBuilder.not(expression.in(values)));
return this;
}
public SimpleSelectBuilder andIn(final Attribute attribute, final Collection values) {
final Expression expression = this.getExpression(attribute, root);
this.predicates.add(expression.in(values));
return this;
}
public SimpleSelectBuilder andContains(final Attribute attribute, final Object value) {
final Expression expression = this.getExpression(attribute, root);
this.predicates.add(criteriaBuilder.isMember(value, expression));
return this;
}
public SimpleSelectBuilder orderByAsc(final Attribute attribute) {
final List orders = new ArrayList<>();
if (this.criteriaQuery.getOrderList() != null) {
orders.addAll(this.criteriaQuery.getOrderList());
}
orders.add(criteriaBuilder.asc(this.getExpression(attribute, root)));
this.criteriaQuery.orderBy(orders.toArray(new Order[orders.size()]));
return this;
}
public SimpleSelectBuilder orderByDesc(final Attribute attribute) {
List orders = this.criteriaQuery.getOrderList();
if (orders == null) {
orders = new ArrayList<>();
}
orders.add(criteriaBuilder.desc(this.getExpression(attribute, root)));
this.criteriaQuery.orderBy(orders.toArray(new Order[orders.size()]));
return this;
}
public SimpleSelectBuilder setFirst(Integer first) {
this.first = first;
return this;
}
public SimpleSelectBuilder setMax(Integer max) {
this.max = max;
return this;
}
public SimpleSelectBuilder setLockModeType(LockModeType lockModeType) {
this.lockModeType = lockModeType;
return this;
}
public List getResultList() {
final TypedQuery query = this.prepareQuery();
if (lockModeType != null) {
query.setLockMode(lockModeType);
}
if (first != null) {
query.setFirstResult(first);
}
if (max != null) {
query.setMaxResults(max);
}
return query.getResultList();
}
public List getCacheableResultList() {
final TypedQuery query = this.prepareQuery();
if (lockModeType != null) {
query.setLockMode(lockModeType);
}
if (first != null) {
query.setFirstResult(first);
}
if (max != null) {
query.setMaxResults(max);
}
query.setHint("org.hibernate.cacheable", true);
query.setHint("org.hibernate.cacheMode", "NORMAL");
return query.getResultList();
}
public E getSingleResult() {
final TypedQuery query = this.prepareQuery();
if (lockModeType != null) {
query.setLockMode(lockModeType);
}
return query.getSingleResult();
}
public E getCacheableSingleResult() {
final TypedQuery query = this.prepareQuery();
if (lockModeType != null) {
query.setLockMode(lockModeType);
}
query.setHint("org.hibernate.cacheable", true);
query.setHint("org.hibernate.cacheMode", "NORMAL");
return query.getSingleResult();
}
private TypedQuery prepareQuery() {
this.criteriaQuery.where(this.predicates.toArray(new Predicate[this.predicates.size()]));
return this.entityManager.createQuery(criteriaQuery);
}
private Expression getExpression(final Attribute attribute, final From from) {
if (attribute instanceof SingularAttribute) {
SingularAttribute singularAttribute = (SingularAttribute) attribute;
return from.get(singularAttribute);
} else if (attribute instanceof PluralAttribute) {
PluralAttribute pluralAttribute = (PluralAttribute) attribute;
return from.get(pluralAttribute);
} else {
throw new PersistenceException("Attribute type of '" + attribute
+ "' must be one of [SingularAttribute, PluralAttribute].");
}
}
private Join getJoinExpression(final Attribute attribute, final From from) {
if (attribute instanceof SingularAttribute) {
final SingularAttribute singularAttribute = (SingularAttribute) attribute;
return from.join(singularAttribute);
} else if (attribute instanceof CollectionAttribute) {
final CollectionAttribute collectionAttribute = (CollectionAttribute) attribute;
return from.join(collectionAttribute);
} else {
throw new PersistenceException("Attribute type of '" + attribute
+ "' must be one of [SingularAttribute, PluralAttribute].");
}
}
public SimpleSelectBuilder joinAnd(final Attribute attribute, final Object value, final Attribute... joinOn) {
Join tableJoin = null;
for (final Attribute join : joinOn) {
if (tableJoin == null) {
tableJoin = this.getJoinExpression(join, root);
} else {
tableJoin = this.getJoinExpression(join, tableJoin);
}
}
if (tableJoin == null) {
throw new PersistenceException("SelectBuilder cannot construct your join statement");
}
final Expression expression = this.getExpression(attribute, tableJoin);
this.predicates.add(criteriaBuilder.equal(expression, value));
return this;
}
}
如果你使用這個.比你的方法成為這個.
public List getProducts(String prodId, String prodName) {
// TODO add like statement to SimpleSelectBuilder
return new SimpleSelectBuilder(this.getEntityManager(), Product.class)
.and(Product_.prodId, prodId))
.and(Product_.prodName, prodName))
.getResultList();
}
如果您編寫自己的SimpleSelectBuilder來處理樣板代碼塊并提高可重用性,那將會更好.例如,您需要在上面的代碼中添加like語句.
管理所有層,事務,連接池等將花費您的時間.相反,您可能需要考慮使用中間件來管理所有這些.在我的項目中,我更喜歡Spring.
總結
以上是生活随笔為你收集整理的java方法criterion_java – JPA Criteria谓词条件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 印巴开战或将引发第3次世界大战?
- 下一篇: java下載與安裝_[Java] 下載與