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);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Ubuntu上安装misterhouse

配置Ubuntu 您将对Ubuntu的配置做某些微小更改以便远程管理MH BOX和安装Misterhouse正常运行所需的必要的软件模块。首先要进行系统升级。因为系统提供的欧洲源更新实在是太慢了&#xff01;更换源是为了节省时间&#xff0c;尽快得将系统更新一遍。安装完系统后这是重要的一个…

java+路径拦截实现_SpringBoot实现拦截器

首先&#xff0c;你的项目要能跑起来&#xff0c;且基于springboot的boot的拦截器不用配置web.xml&#xff0c;按照特定名字书写(后缀注解)&#xff0c;它会自动识别(位置随便放&#xff0c;只要在代码目录下就可以)1.拦截器 SessionInterceptor.javapackage com.hfanss.blog.u…

Codeforces 524C Idempotent functions

题目链接&#xff1a;http://codeforces.com/problemset/problem/542/C 题目大意&#xff1a;给定一种运算f&#xff0c;对于输入的数组来说&#xff0c;一步操作&#xff0c;f(x) a[x]&#xff0c;两步操作&#xff0c;f^2(x) a[a[x]]....倘若每次进行k步操作之后&#xff0…

c 获取mysql安装路径_linux查看mysql安装路径

Linux下查看mysql、apache是否安装,并卸载。指令 ps -ef|grep mysql 得出结果root 17659 1 0 2011 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir/var/lib/mysql --socket/var/lib/mysql/mysql.sock --log-error/var/log/mysqld.log --pid-file/var/run/mysqld/mysqld.p…

微信JS-SDK

<div class"lbox_close wxapi_form"><h3 id"menu-basic">基础接口</h3><span class"desc">判断当前客户端是否支持指定JS接口</span><button class"btn btn_primary" id"checkJsApi">c…

java exif 语言编码_Java读取图片EXIF信息的代码

Java读取图片EXIF信息的代码本文实例讲述了Java读取图片EXIF信息的方法。分享给大家供大家参考。具体分析如下&#xff1a;首先介绍一下什么是EXIF&#xff0c;EXIF是Exchangeable Image File的缩写&#xff0c;这是一种专门为数码相机照片设定的格式。这种格式可以用来记录数字…

Java和pathion_Spring配置中的classpath:与classpath*:的区别

概念解释及使用场景&#xff1a;classpath是指WEB-INF文件夹下的classes目录。通常我们一般使用这种写法实在web.xml中&#xff0c;比如spring加载bean的上下文时&#xff0c;如下&#xff1a;contextConfigLocationclasspath*:/spring-context-*.xmlorg.springframework.web.c…

PHP单引号 ' ',没有任何意义,对所引内容不经任何处理直接拿过来

单引号 没有任何意义&#xff0c;对单引号内部内容不经任何处理直接拿过来。转载于:https://www.cnblogs.com/npk19195global/p/4490758.html

UILabel 宽高自适应

在iOS中&#xff0c;经常遇到需要根据字符串的内容动态指定UILabel&#xff0c;UITextView,UITableViewCell等的高度的情况&#xff0c;这个时候就需要动态的计算字符串内容的高度&#xff0c;下面是计算的方法&#xff1a; /** method 获取指定宽度情况ixa&#xff0c;字符串…

php debug build no,php – 尝试安装xdebug:找不到配置文件

我按照这些说明下载xdebug&#xff1a;http://xdebug.org/wizard.php.向导的输出是这样的&#xff1a;SummaryXdebug installed: noServer API: Apache 2.0 HandlerWindows: noZend Server: noPHP Version: 5.4.17Zend API nr: 220100525PHP API nr: 20100525Debug Build: noTh…

自动自发

<自动自发> 第1章 序言 你属于哪种人&#xff1f; 我们经常会听到这些熟悉的话语&#xff1a; “现在是午餐时间&#xff0c;请您3点以后再打过来吧。” “那根本就不是我负责的工作。” “我现在很忙。” “那是汉曼的工作。” “我不知道该怎样帮助你。” “你去图书馆…

php修改js内容,js怎样修改html元素的内容?HTML DOM实现修改内容

js怎样修改html元素的内容&#xff1f;本章就给大家介绍在js中利用HTML DOM是怎样修改html元素内容的。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你们有所帮助。首先我们要了解HTML DOM是什么&#xff1f;HTML DOM的作用是什么&#xff1f;HTML…

java中的删除函数的使用方法,如何用Java删除文件

本文概述有两种删除Java文件的方法&#xff1a;使用File.delete()方法使用File.deleteOnExit()方法Java File.delete()方法在Java中, 我们可以使用File类的File.delete()方法删除文件。 delete()方法删除由抽象路径名表示的文件或目录。如果路径名是目录, 则该目录必须为空才能…

windows操作笔记

使用服务或其他windows应用的过程中&#xff0c;可能会遇到莫名其妙的错误&#xff0c;这时候从控制面板中&#xff0c;找到管理工具&#xff0c;打开事件查看器&#xff0c;或者通过计算机管理&#xff0c;找到日志中的记录&#xff0c;如果是代码错误&#xff0c;会给出提示信…

php smarty模板配置,Smarty模板简单配置与使用方法示例

这篇文章主要介绍了Smarty模板简单配置与使用方法,涉及Smarty模板的基本配置与缓存文件的相关使用技巧,需要的朋友可以参考下本文实例讲述了Smarty模板简单配置与使用方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;在Smarty目录中建立templates,templates_c,conf…

C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实现

C#开发微信门户及应用(28)--微信“摇一摇周边”功能的使用和接口的实现 原文:C#开发微信门户及应用(28)--微信“摇一摇周边”功能的使用和接口的实现”摇一摇周边“是微信提供的一种新的基于位置的连接方式。用户通过“摇一摇”的“周边”页卡&#xff0c;可以与线下商户进行互…

php控制器实现自动映射,PHP实现路由映射到指定控制器

自定义路由的功能&#xff0c;指定到pathinfo的url上,再次升级之前的脚本SimpleLoader.phpclass SimpleLoader{public static function run($rulesarray()){header("content-type:text/html;charsetutf-8");self::register();self::commandLine();self::router($rule…

【计算几何】点在多边形内部

问题描述&#xff1a;已知点P(x,y)和多边形Poly&#xff0c;判断点P(x,y)是否在多边形内部。 基本方法&#xff1a;射线法 以点P为端点&#xff0c;向左方作射线L&#xff0c;由于多边形是有界的&#xff0c;所以射线L的左端一定在多边形外部&#xff0c;考虑沿着L从无究远处开…

php框架费尔康,GitHub - majixian/study-phalcon: phalcon(费尔康)框架学习笔记

phalcon(费尔康)框架学习笔记以实例程序invo为例(invo程序放在网站根目录下的invo文件夹里&#xff0c;推荐php版本>5.4)环境不支持伪静态网址时的配置第一步&#xff1a;在app\config\config.ini文件中的[application]节点内修改baseUri参数值为/invo/index.php/或/invo/in…

php查找空白行,如何从PHP文本中删除空白行?

小编典典// New line is required to split non-blank linespreg_replace("/(^[\r\n]*|[\r\n])[\s\t]*[\r\n]/", "\n", $string);上面的正则表达式说&#xff1a;/(^[\r\n]*|[\r\n])[\s\t]*[\r\n]/1st Capturing group (^[\r\n]*|[\r\n])1st Alternative: …