JPA中使用Sort排序时遇到的问题

本文解决SpringBoot高版本中Sort和Pageable实例化问题,介绍如何使用静态方法进行排序,避免构造方法权限限制。

org.springframework.data.jpa.repository.JpaRepository中可以使用Sort定义排序规则,但在使用时我发现了一些小问题

正常基于Pageable中的Sort字段排序

Sort sort = new Sort(Direction.ASC, "seqNum");
Pageable pageable = new PageRequest(0, size, sort);

但是,问题来了

他报错了!!!
原因是这两个类的构造方法被定义为了私有或者保护的方法

在这里插入图片描述
我从网上查了好多相关资料,但他们用的时候貌似都可以直接实例化出来,甚至官网上也是这么用的,但我却不能这样用 (好气


为了解决这个问题,我看了下这两个类的源码,好在类里面定义了相关的静态方法能够使用

在这里插入图片描述

所以可以通过调用这些写好的静态方法而不用实例化就能达到相同的效果

Sort sort = Sort.by(Sort.Direction.DESC,"blogs.size");
Pageable pageable = PageRequest.of(0,size,sort);

PS:原因是springboot版本太新导致的


原文链接:https://blog.youkuaiyun.com/qq_44039966/article/details/102713779

==================================================================

 

    @Test
    public void findList() throws Exception {
        // Sort sort = new Sort(Sort.Direction.DESC,"id");
        // Sort.Order order=new Sort.Order(Sort.Direction.DESC, "order_id");
        // PageRequest request  = new PageRequest(0, 2, Sort.by(order));        //这种写法是低版本的spring boot可以这么写,高版本的要下面这么写

        Sort sort = Sort.by(Sort.Direction.DESC,"orderId");       //注意这里不是order_id
        Pageable pageable = PageRequest.of(0,2,sort);

        Page<OrderDTO> result =  orderService.findList(BUYER_OPENID, pageable);
        Assert.assertNotEquals(0, result.getTotalElements());
    }

 

<think>好的,我现在需要帮用户解决关于JPA模糊查询的问题。用户想要API文档或示例代码,以及使用教程。首先,我得回忆一下JPA中模糊查询的几种方法。根据之前的引用,用户提到了几种不同的方式,比如使用findBy+参数名+Like,或者用@Query注解手动编写查询语句,还有可能涉及原生SQL。首先,用户可能不太清楚JPA提供的命名查询方法,也就是SpringData JPA的派生查询机制。这候应该先介绍这种方法,因为它比较简单,只需要在Repository接口中按照特定的方法命名规则定义方法,比如findByNameLike。但需要注意的是,这里的参数需要用户自己加上百分号,或者在方法名中使用Containing,这样JPA会自动添加百分号。这点可能需要详细说明,避免用户在使用忘记添加通配符导致查询不到结果。然后,用户可能遇到更复杂的查询情况,这候可能需要用@Query注解来手动编写JPQL或者原生SQL。比如在引用4中提到的例子,使用CONCAT函数来拼接通配符,或者在参数中直接处理。这候需要解释两种方式的区别,JPQL和原生SQL的使用场景,以及如何传递参数。另外,用户可能关心大小写不敏感的问题,比如在引用5中提到的,如何让查询不区分大小写。这候可能需要提到使用JPA的函数,比如lower()或者upper(),或者在数据库层面设置排序规则,但具体实现可能因数据库而异,需要给出示例。还需要注意,用户可能对方法命名规则不太熟悉,比如Like和Containing的区别,或者StartingWith和EndingWith的用法,这候需要给出具体的示例代码,说明每种方法的作用和参数格式。 另外,用户可能想知道如何结合分页或排序,这候可以补充在方法中添加Pageable或Sort参数的方法,但根据引用内容,原问题中没有提到这部分,所以可能需要简要提及,但重点放在模糊查询的实现上。最后,需要确保示例代码的正确性,比如在@Query注解中使用参数绑定的正确语法,避免SQL注入的风险。同,提醒用户在使用原生查询注意数据库的兼容性。总结下来,回答的结构应该是先介绍不同的方法,每种方法的优缺点,然后给出示例代码,最后可能给出常见问题的解决方案,比如通配符处理、大小写忽略等。同,引用相关的引用内容来支持说明,确保回答的准确性。</think>### JPA模糊查询实现方式及示例代码 JPA实现模糊查询主要有两种方式:**方法命名规则自动生成查询**和**手动编写JPQL/SQL**。以下是具体实现方法及API使用示例: --- #### 一、方法命名规则自动生成查询(推荐) **规则**:`findBy` + 属性名 + `Like`/`Containing`/`StartingWith`/`EndingWith` *引用自[1][2]* ```java public interface UserRepository extends JpaRepository<User, Long> { // 需手动添加%符号 List<User> findByNameLike(String name); // 参数示例:"%张%" // 自动添加%符号(更常用) List<User> findByNameContaining(String keyword); // 自动转为LIKE %keyword% List<User> findByNameStartingWith(String prefix); // 自动转为LIKE prefix% List<User> findByNameEndingWith(String suffix); // 自动转为LIKE %suffix } ``` **注意事项**: - `Like`需要手动添加`%`通配符,其他后缀会自动处理 - 参数传递示例:`findByNameLike("%张%")`[^1] --- #### 二、手动编写JPQL查询(复杂场景) 使用`@Query`注解自定义查询逻辑,支持更复杂的条件组合[^4][^5] ```java public interface ProductRepository extends JpaRepository<Product, Long> { // JPQL写法(推荐) @Query("SELECT p FROM Product p WHERE LOWER(p.name) LIKE LOWER(CONCAT('%', :keyword, '%'))") List<Product> searchByKeywordIgnoreCase(@Param("keyword") String keyword); // 原生SQL写法(需设置nativeQuery=true) @Query(value = "SELECT * FROM products WHERE name LIKE %:keyword%", nativeQuery = true) List<Product> nativeSearch(@Param("keyword") String keyword); } ``` **关键点**: 1. 使用`CONCAT`函数处理通配符拼接 2. `LOWER()`函数实现大小写不敏感查询 3. `@Param`注解绑定命名参数[^4] --- #### 三、动态条件组合查询(JPA Specifications) 对于多条件动态查询,可使用`Specification`构建复杂逻辑: ```java public class UserSpecifications { public static Specification<User> nameContains(String keyword) { return (root, query, cb) -> cb.like(root.get("name"), "%" + keyword + "%"); } } // 使用方式 List<User> results = userRepository.findAll( Specifications.where(UserSpecifications.nameContains("张")) ); ``` --- ### 性能优化建议 1. **索引优化**:为模糊查询字段添加数据库索引(如MySQL前缀索引) 2. **分页处理**:结合`Pageable`实现分页查询,避免全表扫描 3. **避免前导通配符**:`LIKE '%xxx'`会导致索引失效[^5] ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值