jpa常用查询方法使用总结&自定义sql查询

本文介绍Java持久化API(JPA)的自定义查询方法,包括单条件、多条件、in查询、like查询等,并展示了如何使用自定义SQL进行复杂查询及数据更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、JPA自定义查询方法

方法名需要按指定规则来起:
单条数据:find+by+对象属性名
多条数据:findAll+by+对象属性名

实体类

@Data
public class People {

    private String id;
    private String name;
    private String code;
    private Integer age;
}
1.1 单条件查询一条数据
People findByCode(String code);
1.2 单条件查询多条数据
List<People> findAllByCode(String code);
1.3 多条件查询数据
People findByCodeAndAgeAndName(String code,Integer age,String name);
1.4 查询某一个字段

查到字段所在数据,从整条数据中再拿单个字段

People findByName(String name);
1.5 in查询
List<People> findByCodeIn(List<String> codes);
1.6 like查询
List<People> findAllByNameLike(String name);

二、自定义sql查询

2.1 单条件查询
@Query(value = "select * from people where code =?1 ",nativeQuery = true)
People findPeopleCustomizing(String code);
2.2 多条件查询
@Query(value = "select * from people where code =?1 and age = ?2",nativeQuery = true)
People findPeopleCustomizing(String code,Integer age);
2.3 复杂多条件查询
@Query(value = "select * from people where code =?1 and age = ?2 and name in (?3) ",nativeQuery = true)
People findPeopleCustomizing(String code,Integer age,List<String> name);
2.4 根据id修改数据
@Modifying(clearAutomatically = true)
@Query(nativeQuery = true,value = "update people set code = ?1 where id = ?2 ")
int updatePeople(String code, String id);

总览

@Repository
public interface PeopleRepository extends JpaRepository<People,String>, JpaSpecificationExecutor<People> {

    //jpa自带的方法,方法名需要按制定规则来起
    //1.单条件查询一条数据
    People findByCode(String code);

    //2.单条件查询多条数据
    List<People> findAllByCode(String code);

    //3.多条件查询数据
    People findByCodeAndAgeAndName(String code,Integer age,String name);

    //4.查询某一个字段
    People findByName(String name);

    //5.in查询
    List<People> findByCodeIn(List<String> codes);

    //6.like查询
    List<People> findAllByNameLike(String name);

    //自定义sql,方法名随意
    //1.自定义sql:单条件查询
    @Query(value = "select * from people where code =?1 ",nativeQuery = true)
    People findPeopleCustomizing(String code);

    //2.自定义sql:多条件查询
    @Query(value = "select * from people where code =?1 and age = ?2",nativeQuery = true)
    People findPeopleCustomizing(String code,Integer age);

    //3.自定义sql:复杂多条件查询
    @Query(value = "select * from people where code =?1 and age = ?2 and name in (?3) ",nativeQuery = true)
    People findPeopleCustomizing(String code,Integer age,List<String> name);

    //4.自定义sql:根据id修改数据
    @Modifying(clearAutomatically = true)
    @Query(nativeQuery = true,value = "update people set code = ?1 where id = ?2 ")
    int updatePeople(String code, String id);

}
&lt;think&gt;好的,我现在需要帮用户解决关于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注入的风险。同时,提醒用户在使用原生查询时注意数据库的兼容性。总结下来,回答的结构应该是先介绍不同的方法,每种方法的优缺点,然后给出示例代码,最后可能给出常见问题的解决方案,比如通配符处理、大小写忽略等。同时,引用相关的引用内容来支持说明,确保回答的准确性。&lt;/think&gt;### JPA模糊查询实现方式及示例代码 JPA实现模糊查询主要有两种方式:**方法命名规则自动生成查询**和**手动编写JPQL/SQL**。以下是具体实现方法及API使用示例: --- #### 一、方法命名规则自动生成查询(推荐) **规则**:`findBy` + 属性名 + `Like`/`Containing`/`StartingWith`/`EndingWith` *引用自[1][2]* ```java public interface UserRepository extends JpaRepository&lt;User, Long&gt; { // 需手动添加%符号 List&lt;User&gt; findByNameLike(String name); // 参数示例:&quot;%张%&quot; // 自动添加%符号(更常用) List&lt;User&gt; findByNameContaining(String keyword); // 自动转为LIKE %keyword% List&lt;User&gt; findByNameStartingWith(String prefix); // 自动转为LIKE prefix% List&lt;User&gt; findByNameEndingWith(String suffix); // 自动转为LIKE %suffix } ``` **注意事项**: - `Like`需要手动添加`%`通配符,其他后缀会自动处理 - 参数传递示例:`findByNameLike(&quot;%张%&quot;)`[^1] --- #### 二、手动编写JPQL查询(复杂场景) 使用`@Query`注解自定义查询逻辑,支持更复杂的条件组合[^4][^5] ```java public interface ProductRepository extends JpaRepository&lt;Product, Long&gt; { // JPQL写法(推荐) @Query(&quot;SELECT p FROM Product p WHERE LOWER(p.name) LIKE LOWER(CONCAT(&#39;%&#39;, :keyword, &#39;%&#39;))&quot;) List&lt;Product&gt; searchByKeywordIgnoreCase(@Param(&quot;keyword&quot;) String keyword); // 原生SQL写法(需设置nativeQuery=true) @Query(value = &quot;SELECT * FROM products WHERE name LIKE %:keyword%&quot;, nativeQuery = true) List&lt;Product&gt; nativeSearch(@Param(&quot;keyword&quot;) String keyword); } ``` **关键点**: 1. 使用`CONCAT`函数处理通配符拼接 2. `LOWER()`函数实现大小写不敏感查询 3. `@Param`注解绑定命名参数[^4] --- #### 三、动态条件组合查询JPA Specifications) 对于多条件动态查询,可使用`Specification`构建复杂逻辑: ```java public class UserSpecifications { public static Specification&lt;User&gt; nameContains(String keyword) { return (root, query, cb) -&gt; cb.like(root.get(&quot;name&quot;), &quot;%&quot; + keyword + &quot;%&quot;); } } // 使用方式 List&lt;User&gt; results = userRepository.findAll( Specifications.where(UserSpecifications.nameContains(&quot;张&quot;)) ); ``` --- ### 性能优化建议 1. **索引优化**:为模糊查询字段添加数据库索引(如MySQL前缀索引) 2. **分页处理**:结合`Pageable`实现分页查询,避免全表扫描 3. **避免前导通配符**:`LIKE &#39;%xxx&#39;`会导致索引失效[^5] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值