SpringDataJPA对SimpleJpaRepository/JPARepository返回结果的进一步处理(大体浏览,没细看)
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返回结果的进一步处理(大体浏览,没细看)的更多相关文章
- springboot2 统一返回结果
统一返回结果是说,不用在controller层,new一个对象,或用工厂创建这个对象,再返回这个对象,而是这个Action该返回什么就返回什么, 我们再通过mvc的流程,再对返回对象做进一步的封装,以 ...
- Mockito 如何 mock 返回值为 void 的方法
转载:https://unmi.cc/mockito-how-to-mock-void-method/#more-7748 最初接触 Mockito 还思考并尝试过如何用它来 mock 返回值为 vo ...
- java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)
这个数据访问的功能,我在.NET+Mysql .NET+Sqlserver PHP+Mysql上都实现过,并且都发布在了我博客园里面,因为我觉得这个功能实在是太重要,会让你少写很多SQL语句不说,还 ...
- 使用Unity拦截一个返回Task的方法
目标 主要是想为服务方法注入公用的异常处理代码,从而使得业务代码简洁.本人使用Unity.Interception主键来达到这个目标.由于希望默认就执行拦截,所以使用了虚方法拦截器.要实现拦截,需要实 ...
- Android Fragment getActivity返回null解决
在Android开发中,如果我们用到V4包里面的Fragment,在应用被切换到后台的时候,Activity可能被回收,但是创建的所有Fragment则会被保存到Bundle里面,下面是Fragmen ...
- c++ --> 返回值分析
返回值分析 函数不能通过返回指向栈内存的指针,返回指向堆内存的指针是可以的. 一.返回局部变量的值 可以有两种情况:返回局部自动变量和局部静态变量,比如: int func() { ; // 返回局部 ...
- TP5.x——update更新成功但是返回是0
原因 更新的数据和表中的数据一致,这个官方文档上有说明的.所以大家使用这个语句的话需要注意 update 方法返回影响数据的条数,没修改任何数据返回 0 解决方法:我是进行了判断如何和数据库一致直接返 ...
- 用javascript实现禁止页面后退返回上一页的代码
用javascript实现禁止页面后退返回上一页的代码: 有时候我们需要用户在点击了如下一步的按钮时,页面跳转到了下一个页面,这时想不允许用户返回后退到上一页,可以采用下面的方法: 在需要跳转的页 ...
- Apicloud微信支付iOS可以,安卓返回-1的之避坑指南
相信各位小伙伴在接入微信支付的时候,一定遇到过返回-1的这个问题,说实话,这个问题真的很恶心,微信开放平台提供的文档在关于-1这个问题的描述(可能的原因:签名错误.未注册APPID.项目设置APPID ...
随机推荐
- pycharm配置docker
- MySQL实战45讲学习笔记:第四十四讲
一.引子 这是我们专栏的最后一篇答疑文章,今天我们来说说一些好问题. 在我看来,能够帮我们扩展一个逻辑的边界的问题,就是好问题.因为通过解决这样的问题,能够加深我们对这个逻辑的理解,或者帮我们关联到另 ...
- vue项目搭建介绍01
目录 vue项目搭建介绍01 vue 项目框架环境搭建: 创建项目: vue 项目创建流程: vue项目搭建介绍01 vue 项目框架环境搭建: vue 项目框架: vue django(类似)(vu ...
- MySQL存储过程-2019/7/18
MySQL 5.0 版本开始支持存储过程. 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象. 存储过程是为了完成特定功能的SQL语句集,经编 ...
- 在ASP.Net Core 中使用枚举类而不是枚举
前言:我相信大家在编写代码时经常会遇到各种状态值,而且为了避免硬编码和代码中出现魔法数,通常我们都会定义一个枚举,来表示各种状态值,直到我看到Java中这样使用枚举,我再想C# 中可不可以这样写,今天 ...
- Kubernetes生产架构浅谈
注意 本文,只是笔者针对Kubernetes生产环境运行的一些关于架构设计介绍. 介绍 基于 Kubernetes 系统构建的统一开发运维管控平台.在 Kubernetes 基础上,围绕 微服务系统的 ...
- R语言填充空缺值
在R语言中, imputeMissings包的特点是,如果空值是数值型,则使用median代替,如果使用的是character类型,则使用mode值代替. imputeMissing中,需要的包是im ...
- css3 rem手机自适应框架
css3 rem手机自适应框架 rem是按照html的字体大小来 所以 不同宽度浏览器 htmlfont-size不一样 就可以做到自适应了 此方法比百分比方便<pre><!DOCT ...
- 九、Spring之BeanFactory源码分析(一)
Spring之BeanFactory源码分析(一) 注意:该随笔内容完全引自https://blog.csdn.net/u014634338/article/details/82865644,写的 ...
- SpringDataRedis简单入门介绍
1:问题引入 在实际开发中,开发的每一个项目,每天都有大量的人访问,对数据库造成很大的访问压力,甚至是瘫痪.那如何解决呢?我们通常的做法有两种:一种是数据缓存.一种是网页静态化.我们今天讨论第一种解决 ...