`
steven789654
  • 浏览: 40 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

对JPA查询的封装服务类1

 
阅读更多

package com.platform.framework.dao.jpa;

 

import javax.persistence.EntityManager;

import javax.persistence.criteria.CriteriaBuilder;

import javax.persistence.criteria.CriteriaBuilder.In;

import javax.persistence.criteria.CriteriaQuery;

import javax.persistence.criteria.Order;

import javax.persistence.criteria.Predicate;

import javax.persistence.criteria.Root;

 

import org.apache.log4j.Logger;

 

/**

 * Query基类<br>

 * 

 * @describe:封装JPA CriteriaBuilder查询条件

 * @author:lry

 * @since:2014-05-23

 */

@SuppressWarnings({ "unused", "unchecked", "rawtypes", "null", "hiding" })

public class Query implements Serializable {

 

private static final long serialVersionUID = 5064932771068929342L;

 

private static Logger log = Logger.getLogger(Query.class);

 

private EntityManager entityManager;

 

/** 要查询的模型对象 */

private Class clazz;

 

/** 查询条件列表 */

private Root from;

 

private List<Predicate> predicates;

 

private CriteriaQuery criteriaQuery;

 

private CriteriaBuilder criteriaBuilder;

 

/** 排序方式列表 */

private List<Order> orders;

 

/** 关联模式 */

private Map<String, Query> subQuery;

 

private Map<String, Query> linkQuery;

 

private String projection;

 

/** 或条件 */

private List<Query> orQuery;

 

private String groupBy;

 

private Query() {

}

 

private Query(Class clazz, EntityManager entityManager) {

this.clazz = clazz;

this.entityManager = entityManager;

this.criteriaBuilder = this.entityManager.getCriteriaBuilder();

this.criteriaQuery = criteriaBuilder.createQuery(this.clazz);

this.from = criteriaQuery.from(this.clazz);

this.predicates = new ArrayList();

this.orders = new ArrayList();

}

 

/** 通过类创建查询条件 */

public static Query forClass(Class clazz, EntityManager entityManager) {

return new Query(clazz, entityManager);

}

 

/** 增加子查询 */

private void addSubQuery(String propertyName, Query query) {

if (this.subQuery == null)

this.subQuery = new HashMap();

 

if (query.projection == null)

throw new RuntimeException("子查询字段未设置");

 

this.subQuery.put(propertyName, query);

}

 

private void addSubQuery(Query query) {

addSubQuery(query.projection, query);

}

 

/** 增关联查询 */

public void addLinkQuery(String propertyName, Query query) {

if (this.linkQuery == null)

this.linkQuery = new HashMap();

 

this.linkQuery.put(propertyName, query);

}

 

/** 相等 */

public void eq(String propertyName, Object value) {

if (isNullOrEmpty(value))

return;

this.predicates.add(criteriaBuilder.equal(from.get(propertyName), value));

}

 

private boolean isNullOrEmpty(Object value) {

if (value instanceof String) {

return value == null || "".equals(value);

}

return value == null;

}

 

public void or(List<String> propertyName, Object value) {

if (isNullOrEmpty(value))

return;

if ((propertyName == null) || (propertyName.size() == 0))

return;

Predicate predicate = criteriaBuilder.or(criteriaBuilder.equal(from.get(propertyName.get(0)), value));

for (int i = 1; i < propertyName.size(); ++i)

predicate = criteriaBuilder.or(predicate, criteriaBuilder.equal(from.get(propertyName.get(i)), value));

this.predicates.add(predicate);

}

 

public void orLike(List<String> propertyName, String value) {

if (isNullOrEmpty(value) || (propertyName.size() == 0))

return;

if (value.indexOf("%") < 0)

value = "%" + value + "%";

Predicate predicate = criteriaBuilder.or(criteriaBuilder.like(from.get(propertyName.get(0)), value.toString()));

for (int i = 1; i < propertyName.size(); ++i)

predicate = criteriaBuilder.or(predicate, criteriaBuilder.like(from.get(propertyName.get(i)), value));

this.predicates.add(predicate);

}

 

/** 空 */

public void isNull(String propertyName) {

this.predicates.add(criteriaBuilder.isNull(from.get(propertyName)));

}

 

/** 非空 */

public void isNotNull(String propertyName) {

this.predicates.add(criteriaBuilder.isNotNull(from.get(propertyName)));

}

 

/** 不相等 */

public void notEq(String propertyName, Object value) {

if (isNullOrEmpty(value)) {

return;

}

this.predicates.add(criteriaBuilder.notEqual(from.get(propertyName), value));

}

 

/**

* not in

* @param propertyName

*            属性名称

* @param value

*            值集合

*/

public void notIn(String propertyName, Collection value) {

if ((value == null) || (value.size() == 0)) {

return;

}

Iterator iterator = value.iterator();

In in = criteriaBuilder.in(from.get(propertyName));

while (iterator.hasNext()) {

in.value(iterator.next());

}

this.predicates.add(criteriaBuilder.not(in));

}

 

/**

* 模糊匹配

* @param propertyName

*            属性名称

* @param value

*            属性值

*/

public void like(String propertyName, String value) {

if (isNullOrEmpty(value))

return;

if (value.indexOf("%") < 0)

value = "%" + value + "%";

this.predicates.add(criteriaBuilder.like(from.get(propertyName), value));

}

 

/**

* 时间区间查询

* @param propertyName

*            属性名称

* @param lo

*            属性起始值

* @param go

*            属性结束值

*/

public void between(String propertyName, Date lo, Date go) {

if (!isNullOrEmpty(lo) && !isNullOrEmpty(go)) {

this.predicates.add(criteriaBuilder.between(from.get(propertyName), lo, go));

}

 

// if (!isNullOrEmpty(lo) && !isNullOrEmpty(go)) {

// this.predicates.add(criteriaBuilder.lessThan(from.get(propertyName),

// new DateTime(lo).toString()));

// }

// if (!isNullOrEmpty(go)) {

// this.predicates.add(criteriaBuilder.greaterThan(from.get(propertyName),

// new DateTime(go).toString()));

// }

 

}

 

public void between(String propertyName, Number lo, Number go) {

if (!(isNullOrEmpty(lo)))

ge(propertyName, lo);

 

if (!(isNullOrEmpty(go)))

le(propertyName, go);

}

 

/**

* 小于等于

* @param propertyName

*            属性名称

* @param value

*            属性值

*/

public void le(String propertyName, Number value) {

if (isNullOrEmpty(value)) {

return;

}

this.predicates.add(criteriaBuilder.le(from.get(propertyName), value));

}

 

/**

* 小于

* @param propertyName

*            属性名称

* @param value

*            属性值

*/

public void lt(String propertyName, Number value) {

if (isNullOrEmpty(value)) {

return;

}

this.predicates.add(criteriaBuilder.lt(from.get(propertyName), value));

}

 

/**

* 大于等于

* @param propertyName

*            属性名称

* @param value

*            属性值

*/

public void ge(String propertyName, Number value) {

if (isNullOrEmpty(value)) {

return;

}

this.predicates.add(criteriaBuilder.ge(from.get(propertyName), value));

}

 

/**

* 大于

* @param propertyName

*            属性名称

* @param value

*            属性值

*/

public void gt(String propertyName, Number value) {

if (isNullOrEmpty(value)) {

return;

}

this.predicates.add(criteriaBuilder.gt(from.get(propertyName), value));

}

 

/**

* in

* @param propertyName

*            属性名称

* @param value

*            值集合

*/

public void in(String propertyName, Collection value) {

if ((value == null) || (value.size() == 0)) {

return;

}

Iterator iterator = value.iterator();

In in = criteriaBuilder.in(from.get(propertyName));

while (iterator.hasNext()) {

in.value(iterator.next());

}

this.predicates.add(in);

}

 

/** 直接添加JPA内部的查询条件,用于应付一些复杂查询的情况,例如或 */

public void addCriterions(Predicate predicate) {

this.predicates.add(predicate);

}

 

/**

* 创建查询条件

* @return JPA离线查询

*/

public CriteriaQuery newCriteriaQuery() {

criteriaQuery.where(predicates.toArray(new Predicate[0]));

if (!isNullOrEmpty(groupBy)) {

criteriaQuery.groupBy(from.get(groupBy));

}

if (this.orders != null) {

criteriaQuery.orderBy(orders);

}

addLinkCondition(this);

return criteriaQuery;

}

 

 

for (Iterator queryIterator = subQuery.keySet().iterator(); queryIterator.hasNext();) {

String key = (String) queryIterator.next();

Query sub = (Query) subQuery.get(key);

from.join(key);

criteriaQuery.where(sub.predicates.toArray(new Predicate[0]));

addLinkCondition(sub);

}

}

 

public void addOrder(String propertyName, String order) {

if (order == null || propertyName == null)

return;

 

if (this.orders == null)

this.orders = new ArrayList();

 

if (order.equalsIgnoreCase("asc"))

this.orders.add(criteriaBuilder.asc(from.get(propertyName)));

else if (order.equalsIgnoreCase("desc"))

this.orders.add(criteriaBuilder.desc(from.get(propertyName)));

}

 

public void setOrder(String propertyName, String order) {

this.orders = null;

addOrder(propertyName, order);

}

 

public Class getModleClass() {

return this.clazz;

}

 

public String getProjection() {

return this.projection;

}

 

public void setProjection(String projection) {

this.projection = projection;

}

 

public Class getClazz() {

return this.clazz;

}

 

public List<Order> getOrders() {

return orders;

}

 

public void setOrders(List<Order> orders) {

this.orders = orders;

}

 

public EntityManager getEntityManager() {

return this.entityManager;

}

 

public void setEntityManager(EntityManager em) {

this.entityManager = em;

}

 

public Root getFrom() {

return from;

}

 

public List<Predicate> getPredicates() {

return predicates;

}

 

public void setPredicates(List<Predicate> predicates) {

this.predicates = predicates;

}

 

public CriteriaQuery getCriteriaQuery() {

return criteriaQuery;

}

 

public CriteriaBuilder getCriteriaBuilder() {

return criteriaBuilder;

}

 

public void setFetchModes(List<String> fetchField, List<String> fetchMode) {

 

}

 

public String getGroupBy() {

return groupBy;

}

 

public void setGroupBy(String groupBy) {

this.groupBy = groupBy;

}

 

}

分享到:
评论

相关推荐

    基于Java平台的JPA查询封装设计源码

    然而,在实际应用中,开发者常常需要对JPA查询进行封装,以提高代码的可维护性、复用性和性能。 本项目针对这一需求,提供了基于Java平台的JPA查询封装设计源码。源码包含70个文件,其中68个是Java源文件,这些文件...

    封装JPA的数据操作公共DAO基类

    通过将公共通用操作写进父类简化代码,提高代码的复用。 面向接口 使用继承 泛型 引入JPA API查询 以及 元数据 提高代码的安全性.

    JPA分页查询与条件分页查询

    总的来说,JPA分页查询和条件分页查询为开发者带来了极大的便利,它减少了对SQL的直接操作,提高了代码的可读性和可维护性。通过合理地运用Spring Data JPA的特性,可以构建出高效、灵活的数据库访问层。在设计和...

    spring data jpa 的Specifications动态查询

    Spring Data JPA是Spring框架的一个模块,它简化了Java应用程序对数据库的操作,通过提供自动的repository接口实现。在处理复杂的查询需求时,Spring Data JPA的`Specifications`接口提供了动态构建查询的能力,允许...

    JPA.rar_JPA 封装DAO

    1. 定义实体类:根据数据库表结构创建对应的Java类,并使用JPA注解进行映射。 2. 创建Repository接口:继承Spring Data JPA提供的JpaRepository或CrudRepository接口,定义需要的方法。 3. 实现Service层:在Service...

    es工具封装,最新的springboot集成jpa和jest,集群

    1. **ES工具封装**:指的是对Elasticsearch(ES)进行了一些定制化的开发,创建了便于使用的工具类或者库,以简化与ES交互的操作。 2. **Spring Boot集成JPA**:Spring Boot是一个流行的Java框架,用于快速构建微...

    封装通用的Spring3+Struts2+JPA的CRUD 通用分页实现

    "封装通用的Spring3+Struts2+JPA的CRUD 通用分页实现"是一个典型的Java Web开发实践,它结合了Spring框架的依赖注入、Struts2的MVC模式以及JPA(Java Persistence API)的数据持久层处理,来实现数据的创建、读取、...

    JPA复杂查询加分页查询的快速开发

    JPA 提供了分页查询功能,可以根据需要对查询结果进行分页处理。分页查询可以使用 Pageable 对象来实现。Pageable 对象提供了分页查询的相关信息,包括当前页码、每页记录数等。 JPA 复杂查询 JPA 复杂查询可以...

    JPA基础语法资料--JPA_Basic

    JPA支持一对一、一对多、多对一和多对多的关系映射。通过`@OneToOne`、`@OneToMany`、`@ManyToOne`、`@ManyToMany`等注解实现。例如,一个用户可能有多个订单: ```java @Entity public class User { // ... @...

    SpringBoot中使用Spring-data-jpa分页查询

    Spring Data JPA是Spring框架的一部分,它提供了对Java Persistence API (JPA) 的简化封装,允许开发者通过面向接口的方式进行数据库操作,包括进行复杂的查询和分页。 首先,要启用Spring Data JPA功能,我们需要...

    通用JPA查询

    封装hibernate查询方式(JPA)

    JPA Demo 简单的了解下jpa

    4. **数据访问对象(DAO)**: 使用JPA的实体管理器实现对数据库的操作,封装业务逻辑,提供CRUD(Create, Read, Update, Delete)接口。 **JPA操作示例** 在JPA中,操作数据库的基本步骤如下: 1. **创建实体**: ...

    jpa代码自动生成工具-springboot

    - **Service(服务层)**:服务层封装了业务逻辑,调用DAO层的方法处理数据。它通常处理事务管理、业务规则等复杂逻辑。 - **Controller(控制层)**:控制器负责接收HTTP请求,调用服务层的方法,然后返回响应。...

    Spring-JPA

    JPA本身是Java平台上的一个标准,用于管理关系数据库中的数据,而Spring-JPA则是Spring对这个标准的封装和扩展,旨在简化数据访问层的开发。 **一、Spring-JPA的核心概念** 1. **Repository接口**: Spring-JPA通过...

    SpringBoot中封装jdbc工具类

    现在的数据层的开发,大多会使用如MyBatis或...由于部分场景下MyBatis或JPA之类无法满足我的需求,所以我打算自己封装一套查数据库的工具类。 文章地址: https://blog.csdn.net/lxyoucan/article/details/124042295

    JPA(hibernate) Dao 和 DaoSupport

    3. **QueryResult.java** - 这个类可能是查询结果的封装,除了包含查询到的数据外,还可能包含查询的相关信息,如查询条件、受影响的行数或者查询执行时间等。在JPA和Hibernate中,可以直接返回查询结果集,但如果...

    spring jpa

    总的来说,Spring JPA是Spring框架对JPA的一层封装,它使得我们在使用JPA时能够更加便捷高效。通过Repository接口、Query注解、Specifications等特性,我们可以实现灵活且易于维护的数据访问层。同时,Spring JPA还...

    ibatis3中使用jpa的方法进行查询

    在JPA中,实体类代表数据库表,实体之间的关系对应表之间的关系,而Repository接口则封装了CRUD操作。 在Ibatis3中使用JPA的方式,主要是通过注解来实现。开发者可以在Mapper接口中定义方法,并使用JPA的注解(如@...

    springBoot整合springData JPA

    Spring Data JPA是Spring Data项目的一部分,它提供了对JPA的高级封装,使得我们可以用更简洁的代码进行数据库操作。通过使用Spring Data JPA,开发者可以避免编写大量的DAO层代码,如CRUD操作、复杂的查询等。它...

    JPA学习大全.docx

    ORM的核心理念是将数据库表和程序中的实体类对应起来,这样通过操作对象,就能间接地对数据库进行增、删、改、查等操作。使用ORM的主要好处在于减少了大量重复的SQL代码编写,提高了开发的灵活性和代码的可维护性。 ...

Global site tag (gtag.js) - Google Analytics