热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

springboot学习笔记(四)使用querydsl完成条件查询

什么是QueryDSL1,QueryDSL仅仅是一个通用的查询框架,专注于通过JavaAPI构建类型安全的SQL查询。2,Querydsl

什么是QueryDSL

1,QueryDSL仅仅是一个通用的查询框架,专注于通过Java API构建类型安全的SQL查询。

2,Querydsl可以通过一组通用的查询API为用户构建出适合不同类型ORM框架或者是SQL的查询语句,也就是说QueryDSL是基于各种ORM框架以及SQL之上的一个通用的查询框架。

3,借助QueryDSL可以在任何支持的ORM框架或者SQL平台上以一种通用的API方式来构建查询。目前QueryDSL支持的平台包括JPA,JDO,SQL,Java Collections,RDF,Lucene,Hibernate Search。


下面开始讲述项目当中如何使用:

1.引入相关依赖

com.querydslquerydsl-jpacom.querydslquerydsl-apt


2.Repository继承QueryDslPredicateExecutor接口

/*** Test_myspringboot* JpaTest.java*/
package com.springboot.Test_myspringboot.repostory;import java.io.Serializable;import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;import com.springboot.Test_myspringboot.entity.Complaint;/*** @author xuchuang* @updateTime 2017年12月20日 下午5:25:41*/
public interface JpaTest extends JpaRepository,QueryDslPredicateExecutor{}


3.使用queryqsdl插件生成查询实体:

pom引入插件:

com.mysema.maven apt-maven-plugin 1.1.3 process target/generated-sources/java

com.querydsl.apt.jpa.JPAAnnotationProcessor

右键项目,debug as maven generate source成功生成查询实体:



复制到项目当中:下面开始测试 查询:

@RequestMapping("/jpa")public void testJpa(){QComplaint qc=QComplaint.complaint;Predicate pre=qc.id.eq("ff8080816034d03c016034ddccde0003");List list= (List) jpatest.findAll(pre);System.out.println(list.size());}

成功查询到一条id为条件中id的记录。

https://docs.spring.io/spring-data/jpa/docs/1.10.x/reference/pdf/spring-data-jpa-reference.pdfjpa的查询方案官方文档



贴出一些自己项目当中的使用场景:

public Page getComplaintInfos(Integer page, Integer size, HttpServletRequest request) {if (page>0)page=page-1;String title=request.getParameter("title");String createTime=request.getParameter("createTime");String keyWord=request.getParameter("keyWord");QComplaint qc=QComplaint.complaint;Predicate pre=qc.id.isNotNull();if (StringUtils.isNotEmpty(title)) {pre = ExpressionUtils.and(pre, qc.title.like("%" + title + "%"));} if (StringUtils.isNotEmpty(keyWord)) {pre = ExpressionUtils.and(pre, qc.title.like("%" + keyWord + "%").or(qc.details.like("%" + keyWord + "%")));} if (StringUtils.isNotEmpty(createTime)) {pre = ExpressionUtils.and(pre, qc.createdDate.goe(DateUtils.getDate(createTime)));}if (StringUtils.isNotEmpty(createTime)) {pre = ExpressionUtils.and(pre, qc.createdDate.loe(DateUtils.getDateAfter(DateUtils.getDate(createTime), 1)));}Pageable pageable = new PageRequest(page, size, Direction.DESC, "status","createdDate");Page page_data = complaintRepository.findAll(pre,pageable);List list = null;if (page_data != null) {list = page_data.getContent();}List data = new ArrayList();for (Complaint co : list) {ComplaintDTO dto = new ComplaintDTO();BeanUtils.copyProperties(co, dto);if(StringUtils.isNotEmpty(co.getHandledBy())){try {User u=userRepository.findOne(co.getHandledBy());dto.setHandledBy(u.getRealname());} catch (Exception e) {dto.setHandledBy("管理员");}}if(StringUtils.isEmpty(dto.getHandledDetails())){dto.setHandledDetails("");}dto.setCreatedDate(DateUtils.date2String(co.getCreatedDate(), "yyyy-MM-dd"));if (null != co.getHandledDate()) {dto.setHandledDate(DateUtils.date2String(co.getHandledDate(), "yyyy-MM-dd"));}data.add(dto);}Page data_ = new PageImpl(data, pageable, page_data.getTotalElements());return data_;}

分页,排序,模糊查询,条件拼凑

jpa自定义sql案例

package com.bigdata.lab.ymlib.repository;
import java.util.Date;
import java.util.List;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import com.bigdata.lab.ymlib.model.OrderItem;
public interface OrderItemRepository extends CommonMysqlRepository{@Query("SELECT t.literId,t.title,count(1)*t.count,sum(t.count*t.price) as a from OrderItem t where t.createdDate>=:startTime and t.createdDate<=:endTime "+ "and t.orderId in(select id from Order where status=&#39;finished&#39; and payStatus = &#39;paid&#39;) group by t.literId order by a desc")List findSaleLites(@Param("startTime") Date startTime,@Param("endTime") Date endTime);}

package com.bigdata.lab.ymlib.repository;
import java.util.Date;
import java.util.List;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import com.bigdata.lab.ymlib.model.SaleActivity;/** ** @author: xuchuang * @date: 2017年10月18日 上午9:59:48 * @version V1.0 */
public interface SaleActivityRepository extends CommonMysqlRepository {@Query("SELECT t from SaleActivity t where ((beginDate>=:startTime and endDate<=:endTime) "+ "or (endDate>=:endTime and beginDate<=:endTime) "+ "or (beginDate<=:startTime and endDate>=:endTime) "+ "or (beginDate<=:startTime and endDate>=:startTime)) and status=1 and name like %:keyWord%" )List findSaleActivities(@Param("startTime") Date startTime,@Param("endTime") Date endTime,@Param("keyWord") String keyWord);@Query("select DISTINCT t.advertisingPosition from SaleActivity t where t.advertisingPosition!=&#39;null&#39; ")List findAdvertisingPosition();
}










推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
author-avatar
200355人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有