日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java方法criterion_java – JPA Criteria谓词条件

發(fā)布時(shí)間:2024/9/27 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java方法criterion_java – JPA Criteria谓词条件 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先,您必須考慮以分層方式重新構(gòu)建應(yīng)用程序.您至少需要3層,DAO,服務(wù)和WebService.

有關(guān)數(shù)據(jù)庫(kù)和JPA的所有內(nèi)容都必須位于DAO層中.所有與json相關(guān)的東西都必須在你的WebService層中.您的服務(wù)層必須管理Web服務(wù)和dao層之間的事務(wù)和通信.

首先,我們來(lái)談?wù)勀腤eb服務(wù)層.您的JSON對(duì)象可能來(lái)自Restful Web服務(wù).由于幾乎所有框架都支持json編組/解組,因此手動(dòng)解析數(shù)據(jù)傳輸對(duì)象是不明智的.我的意思是,你可能更喜歡聲明一個(gè)FieldDto類并傳遞它的實(shí)例而不是JSONObject.這是FieldDto的一個(gè)例子.這是一個(gè)POJO.

public class FieldDto {

private String prodId;

private String prodName;

// Getters & Setters etc.

}

您可以使用GSON或Jackson輕松地對(duì)json進(jìn)行編組/解組.可能你的框架默認(rèn)使用其中一個(gè)來(lái)處理json轉(zhuǎn)換.

下一層是服務(wù)層.在服務(wù)層中,您可以管理事務(wù)并將DTO對(duì)象轉(zhuǎn)換為DAO層可以輕松理解的對(duì)象.在這種情況下,您的服務(wù)層將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();

}

這不是它.此代碼仍需改進(jìn).在我的一個(gè)項(xiàng)目中,我創(chuàng)建了一個(gè)流暢的api來(lái)管理所有的樣板部件.當(dāng)你開始編寫其他DAO類時(shí),你會(huì)發(fā)現(xiàn)一些代碼塊一遍又一遍地重復(fù).

這是一個(gè)流暢的api的例子.您可能想要構(gòu)建它的版本.

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;

}

}

如果你使用這個(gè).比你的方法成為這個(gè).

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來(lái)處理樣板代碼塊并提高可重用性,那將會(huì)更好.例如,您需要在上面的代碼中添加like語(yǔ)句.

管理所有層,事務(wù),連接池等將花費(fèi)您的時(shí)間.相反,您可能需要考慮使用中間件來(lái)管理所有這些.在我的項(xiàng)目中,我更喜歡Spring.

總結(jié)

以上是生活随笔為你收集整理的java方法criterion_java – JPA Criteria谓词条件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。