关键词:
多条件查询有很多方式
接口命名策略
按照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());
说明:
主要借助CriteriaBuilder
和Predicate
两个类完成拼接条件,
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(" 查看详情