java能写复杂的查询么_spring-data-jpa 复杂查询的写法(包含or的查询)
场景如下:很简单的CMS常用查询,栏目下有多个子栏目,子栏目有包含内容。
public class Channel{
....
private String parentIds;//所有的父节点,简化查询策略 例如 0,1,11,
private List channels = Lists.newArrayList(); //所有的儿子栏目
...
}
public class Content{
private Channel channel; //属于哪个栏目
}
所以比如有如下结构时:栏目A下有两个子栏目B,C;这三个栏目下都有各自的内容, 那么当查询A下的内容时,肯定也是要包含B,C栏目下的内容。
比如说A栏目的id是 10 ,再加上别的查询条件的话, 也就是说 sql 语句肯定是类似:
select * from Content as s where (s.channel.id = 10 or s.channel.parentIds like '%,10,%') and s.yyy = 'xxxxx' and s.xxx = 'yyyy';
想来想去发现实在没有简单的办法做or查询之后跟动态的and查询参数,好像只能自己构造,所以在此记录一下,避免忘记。
此处动态的and 查询条件构造是使用了springside的方法。并且我不知道这样的构造方法是不是spring-data-jpa的标准做法,如果不是,请指正
/**
* 查询某个栏目下的所有文章,并且分页。
*
* 如该栏目下有子栏目,则需要一起显示
*
* @param channelId 栏目id
* @param searchParams
* @param pageNumber
* @param pageSize
* @return
*/
public Page getContentListPaged(final Integer channelId,final Collection filters,int pageNumber, int pageSize){
return contentDao.findAll(new Specification(){
@Override
public Predicate toPredicate(Root root,
CriteriaQuery> query, CriteriaBuilder builder) {
//path转化
List orPredicates = Lists.newArrayList();
Path idPath = root.get("channel").get("id");
Path parentIdsPath = root.get("channel").get("parentIds");
Predicate p1 = builder.equal(root.get("channel").get("id"), channelId);
orPredicates.add(builder.or(p1));
Predicate p2 = builder.like((Path)root.get("channel").get("parentIds"), "%," + channelId + ",%");
orPredicates.add(builder.or(p2));
//以下是springside3提供的方法
Predicate o = DynamicSpecifications.bySearchFilter(filters, Content.class).toPredicate(root, query, builder);
Predicate p = builder.or(orPredicates.toArray(new Predicate[orPredicates.size()]));
query.where(p,o);
return null;
}
}, new PageRequest(pageNumber - 1, pageSize));
}
实际查询的输出sql如下,where之前省略:
where
content0_.channel_id=channel1_.id
and (
content0_.channel_id=21
or channel1_.parentIds like ?
)
and (
content0_.title like ?
) limit ?
另一个使用案例:
前端返回的查询结构:{"字段名1":"字段值1","字段名2":"字段值2"}
Sort sort = new Sort(Sort.Direction.DESC, "id");
Pageable pageable = new PageRequest(page<0?0:page, size<0?1:size, sort);
if(filters != null){
JSONObject params = JSON.parseObject(filters);
Set keys = params.keySet();
if(keys.size() > 0){
Specification spec = new Specification() {
public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder cb) {
List andPredicates = Lists.newArrayList();
for(String key : keys){
if(StringUtils.isNotBlank(params.getString(key)))andPredicates.add(cb.like(root.get(key),"%"+params.getString(key)+"%"));
}
Predicate p = cb.and(andPredicates.toArray(new Predicate[andPredicates.size()]));
query.where(p);
return null;
}
};
return logViewManager.findAll(spec,pageable);
}
}
java能写复杂的查询么_spring-data-jpa 复杂查询的写法(包含or的查询)相关推荐
- java增删改查实例源码_Spring Data JPA 实现简单的CRUD增删改查源码案例
Spring专题 Spring Data JPA 实现简单的CRUD增删改查源码案例 Spring Data JPA旨在简化JPA基础知识库构建和减少需要与数据库进行通信的代码量.第一部分是如何配置H ...
- java多表查询返回数据_spring data jpa如何在多张数据库表中查询返回某些字段值?...
对于多表联查需要使用springdata jpa的@Query标注实现,例如最代码的我的私信列表的查询:public static final String POSTREPOSITORY_FINDAL ...
- jpa多表联查动态_Spring Data JPA 连表动态条件查询
多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现(使用较为复杂,查询不够灵活),第二种是使用原生sql查询. JPA原生SQL连表查询 @Rep ...
- java sql 联表查询系统_Spring Hibernate JPA 联表查询 复杂查询(转)
关系类型Owning-SideInverse-Side one-to-one @OneToOne @OneToOne(mappedBy="othersideName") one-t ...
- jpa 动态查询条件 数组_Spring data jpa 复杂动态查询方式总结
一.Spring data jpa 简介 首先JPA是Java持久层API,由Sun公司开发, 希望整合ORM技术,实现天下归一. 诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,目前也是 ...
- 在每个运行中运行多个查询_Spring Data JPA的运行原理及几种查询方式
Spring Data JPA的运行原理: @PersistenceContext(name="entityManagerFactory") private EntityManag ...
- jpa多表联查动态_Spring Data JPA实现动态多表关联查询
在面向关系型数据库(例如:MySQL)的查询中,动态的.多表关联的查询属于比较复杂的情况.所以,我们只要掌握了这种复杂的查询,当面对其他查询情况时,就能做到胸有成竹. 在java工程中,目前我所了解到 ...
- jpa分页查询_spring data jpa 居然提供了这么多查询方式!
spring data jpa提供了多种查询方式,如下: 方法名称查询 继承Repository接口 测试代码 方法名称中支持的关键字(官方文档提供) 使用JPA命名查询 在User实体中定义jpql ...
- mysql jpa 正则_Spring Data JPA 实例查询
数量:1 刘芳 三.认识"实例查询" 1.概念定义: 上面例子中,是这样创建"实例"的:Example ex = Example.of(customer, ma ...
- spring data jpa封装specification实现简单风格的动态查询
github:https://github.com/peterowang/spring-data-jpa-demo 单一实体的动态查询: @Servicepublic class AdvancedUs ...
最新文章
- python—函数实例一
- ASP.NET MVC Action向视图传值之匿名类型
- Django初次体验
- 代数学笔记4: Galois基本定理
- 微软十大软件开发英雄评选
- 设置NumericStepper控件不可用状态的字体颜色。
- script setup 影响methods选项导出函数
- weka下载安装以及源码运行
- MVC+easyui-datagrid之查看详情
- JUCE学习笔记03-Slider、Listener、Label类
- 离线语音茶吧机设计应用案例
- SQL中的Round函数
- 2021动画渲染农场排名出炉,渲染101综合领先,赛诚和瑞云Renderbus紧随其后!
- 手机java淘汰_极客修:对手并不止安卓!这些年iOS竟然把这么多手机系统淘汰掉了...
- 水表计量单位_关于民用水表,你知道多少?
- error: undefined reference to ‘typeinfo for android::RefBase‘ hidl_death_recipient
- 中鑫吉鼎|你知道自己理财期间这四个更重要吗
- PR如何打开MKV文件?MKV文件如何转为mp4,以及MP4如何被imageJ食用?
- 输入网络密码来进入共享计算机,win7系统电脑共享文件时提示“输入网络密码”怎么解决...
- asp毕业设计——基于asp+access的房产信息管理系统设计与实现(毕业论文+程序源码)——房产信息管理系统
热门文章
- MySQL选择数据库
- c语言指针算法分析怎么写,什么叫指针算法啊??
- 因子分析——matlab
- python编程理论_Python并发编程理论篇,来看看
- 【OpenCV 例程200篇】22. 图像添加非中文文字
- 对于单输入多输出系统matlab,求助!!如何把多输入多输出系统的传函转换为状态空间表达式?...
- java定时任务中使用多线程_java项目中如何利用多线程实现一个定时器任务
- r语言将百分数化为小数_「淮南师出」教师资格/招聘小学数学:《百分数与小数的互化》...
- VGG网络结构(二)
- R树空间索引及其变种