当前位置 > it书童 > java > 正文

SpringDataJPA 多种查询方式

java it书童 2020-11-19 16:31:48 0赞 0踩 36阅读 0评论

使用JPQL的方式查询

使用Spring Data JPA提供的查询方法已经可以解决大部分的应用场景,但是对于某些业务来说,我们还需要灵活的构造查询条件,这时就可以使用@Query注解,结合JPQL的语句方式完成查询

@Query 注解的使用非常简单,只需在方法上面标注该注解,同时提供一个JPQL查询语句即可

dao 层

@Query(value = "from Customer where custName = ?")
public Customer findJpql(String custName);

调用

@Test
public void testFindJPQL() {
    Customer customer = customerDao.findJpql("卡卡罗特");
    System.out.println(customer);
}

更新操作

dao 层

// 默认情况下,占位符与参数顺序一一对应,也可用数字指定对应关系
@Query(value = "update Customer set custName = ?2 where custId = ?1")
@Modifying // 表明当前执行的是一个更新操作
public void updateCustomer(long custId, String custName);

springDataJpa中使用jpql完成更新/删除操作时,需要手动添加事务的支持。由于事务默认会在执行结束之后自动回滚,因此需要用 @Rollback 设置不自动回滚

@Test
@Transactional // 事务支持
@Rollback(value = false) // 不自动回滚
public void testUpdateCustomer() {
    customerDao.updateCustomer(4L, "王子");
}

使用原生 sql

Spring Data JPA 同样也支持原生 sql 语句的查询,用 nativeQuery 作为标识即可

@Query(value = "select * from cst_customer where cust_name like ?1", nativeQuery = true)
public List<Object []> findSql(String name);
@Test
public void testFindSql() {
    List<Object[]> list = customerDao.findSql("王%");
    for (Object[] obj : list) {
        System.out.println(Arrays.toString(obj));
    }
}

方法命名规则查询

顾名思义,方法命名规则查询就是根据方法的名字,就能创建查询。只需要按照Spring Data JPA提供的方法命名规则定义方法的名称,就可以完成查询工作。Spring Data JPA在程序执行的时候会根据方法名称进行解析,并自动生成查询语句进行查询

按照Spring Data JPA 定义的规则,查询方法以findBy开头,涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性首字母需大写。框架在进行方法名解析时,会先把方法名多余的前缀截取掉,然后对剩下部分进行解析。

dao 层

public Customer findByCustName(String custName);

public List<Customer> findByCustNameLike(String custName);

// 使用客户名称模糊匹配和客户所属行业精准匹配的查询
public Customer findByCustNameLikeAndCustIndustry(String custName, String custIndustry);

调用

@Test
public void testFindByCustName() {
    Customer customer = customerDao.findByCustName("孙悟空");
    System.out.println(customer);
}

@Test
public void testFindByCustNameLike() {
    List<Customer> list = customerDao.findByCustNameLike("王%");
    for (Customer customer : list) {
        System.out.println(customer);
    }
}

@Test
public void findByCustNameLikeAndCustIndustry() {
    Customer customer = customerDao.findByCustNameLikeAndCustIndustry("卡%", "保卫地球");
    System.out.println(customer);
}
关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/832