三jpa复杂查询的几种方式(代码片段)

joe- joe-     2023-03-03     768

关键词:

多条件查询有很多方式

接口命名策略

按照JPA的命名策略命名,就可以实现单条件或者多条件的等值查询
命名策略 要以find或者findAll开头,单字段查询,find后跟字段的属性名字,参数传入字段的属性类型,多个条件中间用and区分开。

实例:

接口:

Order findByExpressNo(String expressNo);

List<Order> findByUserId(Integer userId);

List<Order> findByUserNameAndUserAddress(String userName, String userAddress);

测试类:

@Test
public void testFindByXXX() 
    //按照订单号查询
    Order order = orderRepository.findByExpressNo("201802215678");
    log.info("按照订单号查询结果:", order);

    //按照用户编号查询
    List<Order> orderList = orderRepository.findByUserId(2);
    log.info("按照用户编号查询订单:", orderList);

    //按照收货人和收货地址查询
    List<Order> orderList2 = orderRepository.findByUserNameAndUserAddress("张无忌", "光明顶");
    log.info("按照收货人和收货地址查询订单:", orderList2);

说明:
1).后缀跟的是字段名对应的Java类属性名,不是字段名。

2).定义接口的返回值,要区分开始返回一条记录还是多条记录。如果返回多条记录,用一个记录去接收,会报错。

Predicate构建查询条件

方法:
List<T> findAll(@Nullable Specification<T> var1);
Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);

实例:

@Test
public void testPredicate()

    Pageable page = PageRequest.of(0, 2, Sort.by(Sort.Direction.DESC, "orderDate"));//按照订单日期倒叙,查询第一页,每页两条数据

    Specification<Order> userSpecification = new Specification<Order>() 
        @Override
        public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) 
            List<Predicate> list = new ArrayList<>();//查询条件集 
            list.add(criteriaBuilder.like(root.get("userName").as(String.class),  "张" + "%"));//收货人以张开头   like
            list.add(criteriaBuilder.equal(root.get("orderStatus").as(String.class), "已完成"));//订单状态为已完成  =
            list.add(criteriaBuilder.ge(root.get("orderAmount").as(BigDecimal.class), new BigDecimal("100")));//订单金额大于100  >
            list.add(criteriaBuilder.isNotNull(root.get("userAddress").as(String.class)));//收货地址不为空  is not null
            return criteriaBuilder.and(list.toArray(new Predicate[list.size()]));
        
    ;

    Page<Order> all = orderRepository.findAll(userSpecification, page);
    log.info("条件查询结果:",all.getContent());

说明:
主要借助CriteriaBuilderPredicate两个类完成拼接条件,
CriteriaBuilder 提供了 .and(且) .or(或) .like(模糊) .equals(=) isNotNull(非空) .ge(大于) 等方法来构造查询条件,具体使用参见实例。

自定义SQL

JPA同样允许自己写SQL操作记录。

实例:

接口:

@Query(value = "select * from order_info where user_name = ?1 and user_address = ?2", nativeQuery = true)
List<Order> selectByNameAndAddress(String name, String address);

@Modifying
@Transactional
@Query(value = "update order_info set user_address = ?1 where order_id = ?2", nativeQuery = true)
void updateAddressByOrderId(String address, Integer orderId);

测试:

@Test
public void testBySQL() 

    //根据名字和地址查询
    List<Order> orders = orderRepository.selectByNameAndAddress("张无忌", "光明顶");
    log.info("自定义SQL根据名字和地址查询:", orders);

    //修改订单地址
    orderRepository.updateAddressByOrderId("武当山2114", 1);

说明:
1). 自定义SQL可以随便命名方法名

2).需要用@Query注解,如果是更新删除操作还需要有 @Modifying@Transactional 注解

3). SQL里的?表示的占位符,编译和执行的时候,取值是取接口的入参,?后的数字是第几个参数,从0开始

















mybatis模糊查询的几种实现方式(代码片段)

...家好呀,我是柚子,今天这篇文章总结MyBatis模糊查询的几种实现方式~文章目录前言一、模糊查询的几种实现方式1.concat函数和#拼接的方式2.%和$拼接的方式3.concat函数和$拼接的方式4.||和#拼接的方式5.建议使用的方式二、... 查看详情

总结mysql模糊查询的几种方式(代码片段)

总结下开发过程中用过模糊查询功能所用的一些东西,还有就是在建表时一定要考虑完善在建表,否则后期数据量大了在改表会非常的麻烦,请不要为了能够尽快用表而匆匆创建。在这也是给自己一个警醒,以后不再犯。#select... 查看详情

androidipc跨进程通讯的几种方式作用(代码片段)

...一丶跨进程通信作用二丶进程间通信的概念三丶Linux通信的几种方式3.1、管道3.2、信号3.3、消息队列3.4、共享内存3.5、信号量3.6、套接字四丶Android通信的几种方式Bundle&IntentSharedPerferenceActivityContentProviderBroadcastMessagerAIDLSocket一... 查看详情

mybatisplus分页查询的几种方式(代码片段)

...20;LonguserId=params.getLongValue("userId");if(userId!=0)//查询个人简历中的期望城市List<String>expectCityList=resumeDiyMapper.selectExpectCity(userId);//判断是否查询到“期望城市”if(expectCityList!=null&&expectCityList.size()>0&&a... 查看详情

golang实践录:查询数据表的几种方式(代码片段)

本文汇总一些工程中使用到的查询数据表的代码示例。由于是代码片段,不一定保证完整。但其思想可以参考。问题提出工程中经常要使用到数据表(工作多年,不可避免沦为了CRUD工具人),打交道最多的是... 查看详情

flask学习-96.flask-sqlalchemy判断查询结果是否存在的几种方式(代码片段)

前言在查询的时候,经常需要先判断是否存在结果,再进行下一步操作。这里总结了判断查询结果是否存在的几种方式count()统计个数count()方法返回记录条数,使用示例withapp.app_context():count=Students.query.filter(Students.n... 查看详情

springboot+jpa生成id的几种方式:

感谢作者:https://www.jianshu.com/p/3b384e8732321.Tabel  查看详情

python-开根号的几种方式(代码片段)

文章目录前言方法一方法二方法三前言使用Python中的自带库math、自带函数pow和自带库cmath来对数字进行开根号运算方法一使用:math.sqrt(数字)importmathn=int(input('数字:'))x=math.sqrt(n)print(x)print(type(x))#开根号后的类型为... 查看详情

vue---组件引入及使用的几种方式(代码片段)

...过程中,基本都是基于组件化开发项目,总结下使用组件的几个点:一、@符号的使用在vue项目中@符号代表的是根目录,即src目录。二、组件的放置位置在项目中,公用的组件放置在components目录下,项目组件新建views目录来存放... 查看详情

关于区间$mex$的几种做法(代码片段)

...r]\)1、莫队+树状数组权值树状数组维护每个数出现次数;复杂度:\(O(m\sqrtnl 查看详情

markdownjs实现继承的几种方式(代码片段)

查看详情

论项目中静态库符号冲突的几种解决方式(代码片段)

...何解决这类冲突呢?这里我们区分几种不同的冲突情况最复杂的情况:项目中使用的libSDKA.a和libSDKB.a中有符号冲突,这里假定两者都包含了很多同名的代码等这里,两者重复的符号,并一定是在同一个文件中,或者即使在同一个.o中,但是... 查看详情

事件绑定的几种方式(代码片段)

(一)事件绑定的几种方式 javascript给DOM绑定事件处理函数总的来说有2种方式:在html文档中绑定、在js代码中绑定。下面的方式1、方式2属于在html中绑定事件,方式3、方式4和方式5属于在js代码中绑定事件,其中方法5是最推荐... 查看详情

tableviewcell的几种重用方式的区别(代码片段)

TableViewCell的几种重用方式的区别重用机制reuseIdentifierregisterNibclassforCellReuseIdentifier重用生成单元格方法共同点不同点在使用了r方法注册的情况下不使用r方法注册的情况下最终使用方式为什么不用r注册的方式尾文TableViewCell的几... 查看详情

归纳几种freebasic中的几种变量声明方式(代码片段)

1.Dimaasstring2.Dimasstringa,b,c3.constasstringa="hello"4.DimaAsconststring=Str(Rnd)暂时只想到这几种了.... 查看详情

创建线程及启动的几种方式(代码片段)

创建线程及启动的几种方式publicclassThreadNewpublicstaticvoidmain(String[]args)newMyThread1().start();newThread(newMyThread2()).start();FutureTask<Integer>futureTask=newFutureTask<Integer>(newMyThrea 查看详情

latex:fontsize修改字体大小的几种方式(代码片段)

 调整字体大小的几种方式,大小依次增大,具体如下: inyscriptsizefootnotesizesmallormalsizelargeLargeLARGEhugeHuge 【Reference】1、AdjustingfontsizewithTikZpicture  查看详情

得到class类的几种方式与常用方法(代码片段)

得到Class类的几种方式与常用方法Class类Class类的常用方法获得Class类的实例代码如下//测试classs类的创建方式有哪些publicclassTest03publicstaticvoidmain(String[]args)throwsClassNotFoundExceptionPersonperson=newStudent();System.out.println(" 查看详情