三 JPA复杂查询的几种方式

多条件查询有很多方式

接口命名策略

按照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开始

原文地址:https://www.cnblogs.com/joe-/p/10342167.html

时间: 2024-11-09 19:47:53

三 JPA复杂查询的几种方式的相关文章

MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码

先来张在路上-- 此项目是用Maven创建的,没有使用Maven的,自己百度.谷歌去:直接用Junit测试就行,先执行里面的save方法,添加10000条测试数据提供各种聚合查询等. 废话不多说,上干货-- 一.MongoDB数据库的配置(mongodb.xml) 以下是我自己的配置,红色字体请改为自己本机的东东,你说不懂设置端口,不会创建数据库名称,不会配置用户名密码,那有请查阅本系列的第4节(MongoDB的使用学习之(四)权限设置--用户名.密码.端口==),你说懒得设置,那就@#¥%--

Hibernate 带参数查询的两种方式

1.使用?通配符 public User validate(String userName, String password) { String hql = "from User u where u.userName = ? and u.password = ?"; User user = null; List<User> list = ht.find(hql, new Object[]{userName, password}); if (list.size()!=0){

hibernate数据查询的几种方式

1.使用主键id加载对象(load(),get()); 2.通过对象导航,比如通过stu.getTeam()得到team的实例; 3 使用hql; 4使用qbc(query by criteria) 5直接使用sql语句取得记录集; 一般都使用后面三种方式. 注意.hql是面向对象的查询.语法和sql是基本一样的.不区分大小写的,但是注意的是对与对象.必须遵循对象的大小写.因为hql是对像查询..同时我们必须清楚.hql只能取得对象,而不支持uid(update,insert.delete) .

Hibernate 检索查询的几种方式(HQL,QBC,本地SQL,集成Spring等)

1.非集成Spring hibernate的检索方式,主要有以下五种. 1.导航对象图检索方式.(根据已经加载的对象,导航到其他对象.) 2.OID检索方式.(按照对象的OID来检索对象.) 3.HQL检索方式.(使用面向对象的HQL查询语言.) 4.QBC检索方式.(使用QBC(Qurey By Criteria) API来检索对象.) 5.本地SQL检索方式.(使用本地数据库的SQL查询语句.) 1.导航对象图检索方式 利用类与类之间的关系来检索对象.譬如我们要查找一份订单,就可以由订单对象

mybitis实现增,删,改,查,模糊查询的两种方式:(2)

方式二:mapper代理接口方式 这种方式只需要xml+接口(不用写实体类)但是需要符合三个规范 使用mapper'代理接口方式 在同一目录下(可以创建一个源文件夹,达到类文件和xml文件分类的作用) xml中namespace:命名空间为接口的全限定名(包名+类名) xml的文件名和接口的文件名相同,只是后缀名不同 接口中的方法名和xml中sql的id相同 1.创建一个java工程 2.将mysql的jar,mybatis的jar添加到构建路径中 3.写好配置文件 4.连接到数据库 5.写一个

五 Mybatis一对一关联查询的两种方式(基于resultType&amp;基于resultMap)

关联查询: 一个用户对应多个订单,一个订单只有一个用户 订单关联用户:两种方式 一:基于resultTYpe是一个与表关系一样的pojo实现 主表订单,从表用户 首先要有一个与关联查询表关系一样的pojo 在代理接口添加方法,配置代理映射 最后进行单元测试  二 : 基于resultMap(推荐) pojo:在订单类中放置用户类对象,并且提供对应的setget方法  在ResultMap中配置两表关系 基于resultMap配置关联查询的方法 单元测试: 原文地址:https://www.cnb

SpringBoot集成Mybatis实现多表查询的两种方式(基于xml)

 下面将在用户和账户进行一对一查询的基础上进行介绍SpringBoot集成Mybatis实现多表查询的基于xml的两种方式.   首先我们先创建两个数据库表,分别是user用户表和account账户表     user表:  account表:  然后创建实体类        **第一种通过创建子类的方式查询                             需求:查询所有的用户基础信息以及其所属的账户中的金额     1.创建想要得到多表查询数据的实体类(子类)            

Hibernate的条件查询的几种方式+查询所有的记录

条件查询 1. 第一种,用?占位符,如: //登录(用?占位符) public List<UserPO> LoginUser(UserPO up)throws Exception{ Session session = HibernateSessionFactory.getSession(); String hql = "from UserPO where name = ? and pwd= ?"; Query query = session.createQuery(hql)

Hibernate的条件查询的几种方式

1. 第一种,用?占位符,如: //登录(用?占位符) public List<UserPO> LoginUser(UserPO up)throws Exception{ Session session = HibernateSessionFactory.getSession(); String hql = "from UserPO where name = ? and pwd= ?"; Query query = session.createQuery(hql); que