package com.yb.fw.core.helper;

public enum Op {
LIKE,// like
NOTLIKE,// notlike
EQ,// =
NOTEQ,// !=
GT, // >
GTEQ,//>=
LT,//<
LTEQ,//<=
NULL,// is null
NOTNULL,// is not null
IN,// in
NOTIN,// not in
}
package com.yb.fw.core.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.lang.Nullable; import com.yb.fw.core.helper.Condition;
@NoRepositoryBean //表示该接口不会创建这个接口的实例
public interface BaseRepository<T, ID extends Serializable> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
List<Object[]> listBySQL(String sql);
public List<Map<String, Object>> getData(String sql, Map<String, Object> params); public void save(Object... entitys); /**
* 更新实体
*
* @param entity 实体id
*/
public void update(Object... entitys); /**
* 删除实体
*
* @param entityClass 实体类
* @param entityid 实体id
*/
public <E> void delete(Class<T> entityClass, Object entityid); /**
* 删除实体
*
* @param entityClass 实体类
* @param entityids 实体id数组
*/
public <E> void delete(Class<T> entityClass, Object[] entityids); /**
* 获取实体
*
* @param <T>
* @param entityClass 实体类
* @param entityId 实体id
* @return
*/
public <E> T find(Class<T> entityClass, Object entityId); public T findOne(ID id); /**
* 执行ql语句
* @param qlString 基于jpa标准的jpql语句
* @param values jpql中的?参数值,单个参数值或者多个参数值
* @return 返回执行后受影响的数据个数
*/
int executeUpdate(String qlString, Object... values); /**
* 执行ql语句
* @param qlString 基于jpa标准的jpql语句
* @param params key表示jpql中参数变量名,value表示该参数变量值
* @return 返回执行后受影响的数据个数
*/
int executeUpdate(String qlString, Map<String, Object> params); /**
* 执行ql语句,可以是更新或者删除操作
* @param qlString 基于jpa标准的jpql语句
* @param values jpql中的?参数值
* @return 返回执行后受影响的数据个数
* @throws Exception
*/
int executeUpdate(String qlString, List<Object> values); /**
* 执行原生SQL语句,可以是更新或者删除操作
* @param sql 标准的sql语句
* @return 返回执行后受影响的数据个数
* @throws Exception
*/
int executeBySQL(String sql); int executeBySQL(String sql, Object... values); /**
* jpql查询语句
* @param qlString 基于jpa标准的jpql语句
* @param values jpql中的?参数值,单个参数值或者多个参数值
* @return 返回查询的数据集合
*/
List<T> findAll(String qlString, Object... values); List<T> findAll(String qlString, Map<String, Object> params); List<T> findAll(@Nullable List<Condition> conditions); boolean support(String modelType); }
package com.yb.fw.core.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Optional; import javax.persistence.EntityManager;
import javax.persistence.Query; import org.hibernate.SQLQuery;
import org.hibernate.query.internal.NativeQueryImpl;
import org.hibernate.transform.Transformers;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.support.JpaEntityInformation;
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
import org.springframework.data.repository.NoRepositoryBean; import com.yb.fw.core.helper.Condition;
import com.yb.fw.core.helper.QueryUtil; //Spring Data JPA都是调用SimpleJpaRepository来创建实例
public class BaseRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID>
implements BaseRepository<T, ID> { // 用于操作数据库
private final EntityManager em; private final JpaEntityInformation<T, ID> entityInformation; BaseRepositoryImpl(JpaEntityInformation<T, ID> entityInformation,
EntityManager entityManager) {
super(entityInformation, entityManager);
this.em = entityManager;
this.entityInformation=entityInformation;
} // 通过EntityManager来完成查询
@Override
public List<Object[]> listBySQL(String sql) {
return em.createNativeQuery(sql).getResultList();
} public List<Map<String, Object>> getData(String sql, Map<String, Object> params) {
Query query = em.createNativeQuery(sql);
query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
if(params!=null)
for (String name : params.keySet()) {
query.setParameter(name, params.get(name));
}
return query.getResultList();
} @Override
public void save(Object... entities) {
if (null != entities) {
for (Object entity : entities) {
em.persist(entity);
}
}
} @Override
public void update(Object... entities) {
if (null != entities) {
for (Object entity : entities) {
em.merge(entity);
}
}
} public <E> void delete(Class<T> entityClass, Object entityid) {
delete(entityClass, new Object[] { entityid });
} @Override
public <E> void delete(Class<T> entityClass, Object[] entityids) {
for (Object id : entityids) {
em.remove(em.getReference(entityClass, id));
}
} public <E> T find(Class<T> entityClass, Object entityId) {
return em.find(entityClass, entityId);
} public T findOne(ID id) {
Optional<T> entityById=findById(id);
if(entityById.isPresent())
return entityById.get();
return null;
} @Override
public boolean support(String modelType) {
System.out.println(modelType+"###"+entityInformation.getEntityName());
return entityInformation.getEntityName().equals(modelType);
} @Override
public int executeUpdate(String qlString, Object... values) {
Query query = em.createQuery(qlString);
if (values != null) {
for (int i = ; i < values.length; i++) {
query.setParameter(i + , values[i]);
}
}
return query.executeUpdate();
} @Override
public int executeUpdate(String qlString, Map<String, Object> params) {
Query query = em.createQuery(qlString);
for (String name : params.keySet()) {
query.setParameter(name, params.get(name));
}
return query.executeUpdate();
} @Override
public int executeUpdate(String qlString, List<Object> values) {
Query query = em.createQuery(qlString);
for (int i = ; i < values.size(); i++) {
query.setParameter(i + , values.get(i));
}
return query.executeUpdate();
} @Override
public int executeBySQL(String sql) {
return em.createNativeQuery(sql).executeUpdate();
} @Override
public int executeBySQL(String sql,Object... values) {
Query query = em.createNativeQuery(sql);
if (values != null) {
for (int i = ; i < values.length; i++) {
query.setParameter(i + , values[i]);
}
}
return query.executeUpdate();
} @Override
public List<T> findAll(String qlString, Object... values) {
Query query = em.createQuery(qlString);
if (values != null) {
for (int i = ; i < values.length; i++) {
query.setParameter(i + , values[i]);
}
}
return query.getResultList();
} @Override
public List<T> findAll(String qlString, Map<String, Object> params) {
Query query = em.createQuery(qlString);
for (String name : params.keySet()) {
query.setParameter(name, params.get(name));
}
return query.getResultList();
} @Override
public List<T> findAll(Sort sort) {
// TODO 这是系统自动生成描述,请在此补完后续代码
return super.findAll(sort);
} @Override
public Page<T> findAll(Pageable pageable) {
// TODO 这是系统自动生成描述,请在此补完后续代码
return super.findAll(pageable);
} @Override
public List<T> findAll(List<Condition> conditions) {
// TODO Auto-generated method stub
return findAll(QueryUtil.where(conditions));
} }
package com.yb.fw.core.helper;

import org.apache.commons.lang3.StringUtils;
import org.springframework.data.jpa.domain.Specification; import javax.persistence.criteria.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set; /**
* SQL拼接工具类
*
*/
public class QueryUtil { private Specification spec; private QueryUtil(Specification spec) {
this.spec = spec;
} public static QueryUtil wheres(Specification spec) {
return new QueryUtil(spec);
} @SuppressWarnings("unchecked")
public QueryUtil and(Specification other) {
this.spec.and(other);
return this;
} @SuppressWarnings("unchecked")
public QueryUtil or(Specification other) {
this.spec.or(other);
return this;
} public Specification build() {
return this.spec;
} /**
* 单where条件
*
* @param p
* @return
*/
public static Specification where(Condition p) {
List<Condition> ps = new ArrayList<>();
ps.add(p);
return where(ps);
} /**
* 多where条件and连接
*
* @param ps
* @param <T>
* @return
*/
public static <T> Specification<T> where(List<Condition> ps) {
return (Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) ->
builder.and(getPredicateList(root, builder, ps));
} /**
* 多where条件or连接
*
* @param ps
* @param <T>
* @return
*/
public static <T> Specification<T> or(List<Condition> ps) {
return (Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) ->
builder.or(getPredicateList(root, builder, ps));
} /**
* 获取查询条件数组
*
* @param root
* @param builder
* @param ps
* @return
*/
private static Predicate[] getPredicateList(Root<?> root, CriteriaBuilder builder, List<Condition> ps) {
List<Predicate> predicateList = new ArrayList<>();
ps.forEach(p -> {
Predicate predicate = buildPredicate(builder, root, p);
predicateList.add(predicate);
});
return predicateList.toArray(new Predicate[predicateList.size()]);
} /**
* 选取查询方式
*
* @param cb
* @param path
* @param p
* @return
*/
private static Predicate buildPredicate(CriteriaBuilder cb, Root<?> root,Condition p) {
String fieldName=p.getName();
Path path;
if (fieldName.contains(".")) {
String[] names = StringUtils.split(fieldName, ".");
//获取该属性的类型,Set?List?Map?
path = root.get(names[]);
Class clazz = path.getJavaType();
if (clazz.equals(Set.class)) {
SetJoin setJoin = root.joinSet(names[]);
path = setJoin.get(names[]);
} else if (clazz.equals(List.class)) {
ListJoin listJoin = root.joinList(names[]);
path = listJoin.get(names[]);
} else if (clazz.equals(Map.class)) {
MapJoin mapJoin = root.joinMap(names[]);
path = mapJoin.get(names[]);
} else {
//是many to one时
path = path.get(names[]);
} } else {
//单表查询
path = root.get(fieldName);
}
// Path path=root.get(p.getName());
Predicate predicate;
switch (p.getOperator()) {
case LIKE:
predicate = cb.like(path, "%"+p.getValue().toString()+"%");
break;
case NOTLIKE:
predicate = cb.notLike(path, "%"+p.getValue().toString()+"%");
break;
case EQ:
predicate = cb.equal(path, p.getValue());
break;
case NOTEQ:
predicate = cb.notEqual(path, p.getValue());
break;
case GT:
predicate = cb.greaterThan(path, (Comparable) p.getValue());
break;
case GTEQ:
predicate = cb.greaterThanOrEqualTo(path, (Comparable) p.getValue());
break;
case LT:
predicate = cb.lessThan(path, (Comparable) p.getValue());
break;
case LTEQ:
predicate = cb.lessThanOrEqualTo(path, (Comparable) p.getValue());
break;
case NULL:
predicate = cb.isNull(path);
break;
case NOTNULL:
predicate = cb.isNotNull(path);
break;
case IN:
predicate = getIn(path, p.getValue());
break;
case NOTIN:
predicate = getIn(path, p.getValue()).not();
break;
default:
throw new IllegalArgumentException("非法的操作符");
}
return predicate;
} /**
* 创建in操作
*
* @param path
* @param value
* @param <T>
* @return
*/
private static <T> Predicate getIn(Path path, T value) {
if (value instanceof Object[]) {
return path.in((Object[]) value);
} else if (value instanceof Collection) {
return path.in((Collection) value);
} else {
throw new IllegalArgumentException("非法的IN操作");
}
} /***********************************************单where条件查询********************************************************/ // like
public static Specification like(String name, String value) {
return (root, query, cb) ->
cb.like(root.get(name), value);
} // notlike
public static Specification notLike(String name, String value) {
return (root, query, cb) ->
cb.like(root.get(name), value).not();
} // =
public static Specification eq(String name, Object value) {
return (root, query, cb) ->
cb.equal(root.get(name), value);
} // !=
public static Specification notEq(String name, Object value) {
return (root, query, cb) ->
cb.notEqual(root.get(name), value);
} // >
public static Specification gt(String name, Object value) {
return (root, query, cb) ->
cb.greaterThan(root.get(name), (Comparable) value);
} // >=
public static Specification gtEq(String name, Object value) {
return (root, query, cb) ->
cb.greaterThanOrEqualTo(root.get(name), (Comparable) value);
} // <
public static Specification lt(String name, Object value) {
return (root, query, cb) ->
cb.lessThan(root.get(name), (Comparable) value);
} // <=
public static Specification ltEq(String name, Object value) {
return (root, query, cb) ->
cb.lessThanOrEqualTo(root.get(name), (Comparable) value);
} // is null
public static Specification isNull(String name) {
return (root, query, cb) ->
cb.isNull(root.get(name));
} // is not null
public static Specification notNull(String name) {
return (root, query, cb) ->
cb.isNotNull(root.get(name));
} // in
public static Specification in(String name, Object value) {
return (root, query, cb) ->
root.get(name).in(value);
} // not in
public static Specification notIn(String name, Object value) {
return (root, query, cb) ->
root.get(name).in(value).not();
}
}
public List<MConsignment> findSellingByUserId(String userId) {
List<Condition> conditions=new ArrayList<Condition>();
conditions.add(Condition.eq("userId", userId));
conditions.add(Condition.eq("endTime",-));
conditions.add(Condition.eq("isValid",YesOrNo.YES));
return dao.findAll(QueryUtil.where(conditions));
} public List<MConsignment> findSoldByUserId(String userId) {
List<Condition> conditions=new ArrayList<Condition>();
conditions.add(Condition.eq("userId", userId));
conditions.add(Condition.notEq("endTime",-));
return dao.findAll(conditions);
} public List<MConsignment> findSellFailByUserId(String userId) {
List<Condition> conditions=new ArrayList<Condition>();
conditions.add(Condition.gt("remNum", ));
conditions.add(Condition.eq("isValid",YesOrNo.NO));
return dao.findAll(QueryUtil.where(conditions));
}

SpringDataJPA对SimpleJpaRepository/JPARepository返回结果的进一步处理(大体浏览,没细看)的更多相关文章

  1. springboot2 统一返回结果

    统一返回结果是说,不用在controller层,new一个对象,或用工厂创建这个对象,再返回这个对象,而是这个Action该返回什么就返回什么, 我们再通过mvc的流程,再对返回对象做进一步的封装,以 ...

  2. Mockito 如何 mock 返回值为 void 的方法

    转载:https://unmi.cc/mockito-how-to-mock-void-method/#more-7748 最初接触 Mockito 还思考并尝试过如何用它来 mock 返回值为 vo ...

  3. java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)

    这个数据访问的功能,我在.NET+Mysql .NET+Sqlserver  PHP+Mysql上都实现过,并且都发布在了我博客园里面,因为我觉得这个功能实在是太重要,会让你少写很多SQL语句不说,还 ...

  4. 使用Unity拦截一个返回Task的方法

    目标 主要是想为服务方法注入公用的异常处理代码,从而使得业务代码简洁.本人使用Unity.Interception主键来达到这个目标.由于希望默认就执行拦截,所以使用了虚方法拦截器.要实现拦截,需要实 ...

  5. Android Fragment getActivity返回null解决

    在Android开发中,如果我们用到V4包里面的Fragment,在应用被切换到后台的时候,Activity可能被回收,但是创建的所有Fragment则会被保存到Bundle里面,下面是Fragmen ...

  6. c++ --> 返回值分析

    返回值分析 函数不能通过返回指向栈内存的指针,返回指向堆内存的指针是可以的. 一.返回局部变量的值 可以有两种情况:返回局部自动变量和局部静态变量,比如: int func() { ; // 返回局部 ...

  7. TP5.x——update更新成功但是返回是0

    原因 更新的数据和表中的数据一致,这个官方文档上有说明的.所以大家使用这个语句的话需要注意 update 方法返回影响数据的条数,没修改任何数据返回 0 解决方法:我是进行了判断如何和数据库一致直接返 ...

  8. 用javascript实现禁止页面后退返回上一页的代码

    用javascript实现禁止页面后退返回上一页的代码:  有时候我们需要用户在点击了如下一步的按钮时,页面跳转到了下一个页面,这时想不允许用户返回后退到上一页,可以采用下面的方法:  在需要跳转的页 ...

  9. Apicloud微信支付iOS可以,安卓返回-1的之避坑指南

    相信各位小伙伴在接入微信支付的时候,一定遇到过返回-1的这个问题,说实话,这个问题真的很恶心,微信开放平台提供的文档在关于-1这个问题的描述(可能的原因:签名错误.未注册APPID.项目设置APPID ...

随机推荐

  1. Forethought Future Cup - Elimination Round C 二分 + 交互(求树的直径)

    https://codeforces.com/contest/1146/problem/C 题意 一颗大小为n的树,每次可以询问两个集合,返回两个集合中的点的最大距离,9次询问之内得出树的直径 题解 ...

  2. 机器学习之KNN

    KNN做回归和分类的主要区别在于最后做预测时候的决策方式不同.KNN做分类预测时,一般是选择多数表决法,即训练集里和预测的样本特征最近的K个样本,预测为里面有最多类别数的类别.而KNN做回归时,一般是 ...

  3. BDFramework.Core 学习

    x哥(懂的都懂)的框架, 拿点代码过来做注释. 想了解详情可以去他的github https://github.com/yimengfan/BDFramework.Core # Object file ...

  4. js --自动播放音频

    简介 基本使用 chrome下无法自动播放问题处理 简介 音频的播放使用audio进行操作,可以有两种方式处理(纯js和html标签+js). audio是html5的新标签,用于定义声音 audio ...

  5. 【新特性速递】优化Shift/Ctrl行多选逻辑,和Windows的文件资源管理器保持一致!

    别告诉我你不知道 别告诉我你不知道可以使用键盘的 Shift 和 Ctrl 来多选表格行,因为这个在 Windows 文件资源管理器中的常用操作,此时的画风是这样的: 这个动图中进行了如下操作: 1. ...

  6. Java连载36-IDE使用

    一.主方法注意 每一个类都可以编写一个主方法,但是一般情况下,一个系统只有一个入口,所以主方法一般写一个 二.Myeclipse的使用 1.在workspace中工作区中有一个文件夹.metadata ...

  7. LeetCode 206:反转链表 Reverse Linked List

    反转一个单链表. Reverse a singly linked list. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3- ...

  8. HBase的java操作,最新API。(查询指定行、列、插入数据等)

    关于HBase环境搭建和HBase的原理架构,请见笔者相关博客. 1.HBase对java有着较优秀的支持,本文将介绍如何使用java操作Hbase. 首先是pom依赖: <dependency ...

  9. Appium swipe实现屏幕滑动

    在 Appium 中提供 swipe() 方法来模拟用户滑动屏幕. swipe() 实现过程 是先通过在屏幕上标记两个坐标,然后再从开始坐标移动到结束坐标. 先看下 swipe 方法定义: def s ...

  10. Logstash:处理多个input

    Logstash:处理多个input Logstash的整个pipleline分为三个部分: input插件:提取数据. 这可以来自日志文件,TCP或UDP侦听器,若干协议特定插件(如syslog或I ...