场景如下:很简单的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的查询)相关推荐

  1. java增删改查实例源码_Spring Data JPA 实现简单的CRUD增删改查源码案例

    Spring专题 Spring Data JPA 实现简单的CRUD增删改查源码案例 Spring Data JPA旨在简化JPA基础知识库构建和减少需要与数据库进行通信的代码量.第一部分是如何配置H ...

  2. java多表查询返回数据_spring data jpa如何在多张数据库表中查询返回某些字段值?...

    对于多表联查需要使用springdata jpa的@Query标注实现,例如最代码的我的私信列表的查询:public static final String POSTREPOSITORY_FINDAL ...

  3. jpa多表联查动态_Spring Data JPA 连表动态条件查询

    多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现(使用较为复杂,查询不够灵活),第二种是使用原生sql查询. JPA原生SQL连表查询 @Rep ...

  4. java sql 联表查询系统_Spring Hibernate JPA 联表查询 复杂查询(转)

    关系类型Owning-SideInverse-Side one-to-one @OneToOne @OneToOne(mappedBy="othersideName") one-t ...

  5. jpa 动态查询条件 数组_Spring data jpa 复杂动态查询方式总结

    一.Spring data jpa 简介 首先JPA是Java持久层API,由Sun公司开发, 希望整合ORM技术,实现天下归一.  诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,目前也是 ...

  6. 在每个运行中运行多个查询_Spring Data JPA的运行原理及几种查询方式

    Spring Data JPA的运行原理: @PersistenceContext(name="entityManagerFactory") private EntityManag ...

  7. jpa多表联查动态_Spring Data JPA实现动态多表关联查询

    在面向关系型数据库(例如:MySQL)的查询中,动态的.多表关联的查询属于比较复杂的情况.所以,我们只要掌握了这种复杂的查询,当面对其他查询情况时,就能做到胸有成竹. 在java工程中,目前我所了解到 ...

  8. jpa分页查询_spring data jpa 居然提供了这么多查询方式!

    spring data jpa提供了多种查询方式,如下: 方法名称查询 继承Repository接口 测试代码 方法名称中支持的关键字(官方文档提供) 使用JPA命名查询 在User实体中定义jpql ...

  9. mysql jpa 正则_Spring Data JPA 实例查询

    数量:1 刘芳 三.认识"实例查询" 1.概念定义: 上面例子中,是这样创建"实例"的:Example ex = Example.of(customer, ma ...

  10. spring data jpa封装specification实现简单风格的动态查询

    github:https://github.com/peterowang/spring-data-jpa-demo 单一实体的动态查询: @Servicepublic class AdvancedUs ...

最新文章

  1. python—函数实例一
  2. ASP.NET MVC Action向视图传值之匿名类型
  3. Django初次体验
  4. 代数学笔记4: Galois基本定理
  5. 微软十大软件开发英雄评选
  6. 设置NumericStepper控件不可用状态的字体颜色。
  7. script setup 影响methods选项导出函数
  8. weka下载安装以及源码运行
  9. MVC+easyui-datagrid之查看详情
  10. JUCE学习笔记03-Slider、Listener、Label类
  11. 离线语音茶吧机设计应用案例
  12. SQL中的Round函数
  13. 2021动画渲染农场排名出炉,渲染101综合领先,赛诚和瑞云Renderbus紧随其后!
  14. 手机java淘汰_极客修:对手并不止安卓!这些年iOS竟然把这么多手机系统淘汰掉了...
  15. 水表计量单位_关于民用水表,你知道多少?
  16. error: undefined reference to ‘typeinfo for android::RefBase‘ hidl_death_recipient
  17. 中鑫吉鼎|你知道自己理财期间这四个更重要吗
  18. PR如何打开MKV文件?MKV文件如何转为mp4,以及MP4如何被imageJ食用?
  19. 输入网络密码来进入共享计算机,win7系统电脑共享文件时提示“输入网络密码”怎么解决...
  20. asp毕业设计——基于asp+access的房产信息管理系统设计与实现(毕业论文+程序源码)——房产信息管理系统

热门文章

  1. MySQL选择数据库
  2. c语言指针算法分析怎么写,什么叫指针算法啊??
  3. 因子分析——matlab
  4. python编程理论_Python并发编程理论篇,来看看
  5. 【OpenCV 例程200篇】22. 图像添加非中文文字
  6. 对于单输入多输出系统matlab,求助!!如何把多输入多输出系统的传函转换为状态空间表达式?...
  7. java定时任务中使用多线程_java项目中如何利用多线程实现一个定时器任务
  8. r语言将百分数化为小数_「淮南师出」教师资格/招聘小学数学:《百分数与小数的互化》...
  9. VGG网络结构(二)
  10. R树空间索引及其变种