java接口命名 findby getby_三 JPA复杂查询的几种方式

多条件查询有很多方式

接口命名策略

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

接口:

Order findByExpressNo(String expressNo);

List findByUserId(Integer userId);

List findByUserNameAndUserAddress(String userName, String userAddress);

测试类:

@Test

public void testFindByXXX() {

//按照订单号查询

Order order = orderRepository.findByExpressNo("201802215678");

log.info("按照订单号查询结果:{}", order);

//按照用户编号查询

List orderList = orderRepository.findByUserId(2);

log.info("按照用户编号查询订单:{}", orderList);

//按照收货人和收货地址查询

List orderList2 = orderRepository.findByUserNameAndUserAddress("张无忌", "光明顶");

log.info("按照收货人和收货地址查询订单:{}", orderList2);

}

说明: 1).后缀跟的是字段名对应的Java类属性名,不是字段名。
2).定义接口的返回值,要区分开始返回一条记录还是多条记录。如果返回多条记录,用一个记录去接收,会报错。

Predicate构建查询条件

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

实例:

@Test

public void testPredicate(){

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

Specification userSpecification = new Specification() {

@Override

public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {

List 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 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 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 orders = orderRepository.selectByNameAndAddress("张无忌", "光明顶");

log.info("自定义SQL根据名字和地址查询:{}", orders);

//修改订单地址

orderRepository.updateAddressByOrderId("武当山2114", 1);

}

说明: 1). 自定义SQL可以随便命名方法名
2).需要用@Query注解,如果是更新删除操作还需要有 @Modifying和@Transactional 注解
3). SQL里的?表示的占位符,编译和执行的时候,取值是取接口的入参,?后的数字是第几个参数,从0开始

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
JPA方法命名规则可以根据方法名自动生成查询。以下是JPA方法命名语法规则中的常见规范: 1. 查询方法: - 通过方法名生成简单查询:findBy/getBy/queryBy/readBy 后面跟要查询的字段名,用于精确匹配。 - find/get/query/read 后面跟要查询的字段名,使用条件表达式进行模糊匹配。 - findAll/getAll 后面不跟字段名,表示查询所有记录。 2. 支持的关键字: - And:连接多个查询条件,相当于SQL中的AND。 - Or:连接多个查询条件,相当于SQL中的OR。 - Between:用于查询字段在某个范围内的记录。 - LessThan/LessThanEqual:用于查询字段小于某个值的记录。 - GreaterThan/GreaterThanEqual:用于查询字段大于某个值的记录。 - IsNull/IsNotNull:用于查询字段为空或不为空的记录。 - Like/NotLike:用于模糊查询字段值。 - OrderBy:用于指定查询结果的排序方式。 3. 删除方法: - 通过方法名生成删除查询:deleteBy/removeBy 后面跟要查询的字段名,用于精确匹配。 - delete/remove 后面跟要查询的字段名,使用条件表达式进行模糊匹配。 4. 统计方法: - 通过方法名生成统计查询:countBy 后面跟要查询的字段名,用于精确匹配。 - count 后面不跟字段名,表示统计所有记录数。 5. 更新方法: - 通过方法名生成更新查询:updateBy 后面跟要查询的字段名,用于精确匹配。 - update 后面跟要查询的字段名,使用条件表达式进行模糊匹配。 - 支持的关键字:Set:用于设置要更新的字段的值。Where:用于指定更新操作的条件。 以下是一个示例: ``` public interface UserRepository extends JpaRepository<User, Long> { // 根据用户名查询用户信息 User findByUsername(String username); // 查询年龄小于等于指定值的用户信息 List<User> findByAgeLessThanEqual(int age); // 查询用户名以指定字符串开头的用户信息 List<User> findByUsernameStartingWith(String prefix); // 统计年龄大于指定值的用户数量 long countByAgeGreaterThan(int age); // 删除用户名包含指定字符串的用户信息 void deleteByUsernameContaining(String keyword); // 更新用户名为指定值的用户邮箱 @Modifying @Query("update User u set u.email = :email where u.username = :username") void updateEmailByUsername(@Param("email") String email, @Param("username") String username); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值