前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >芋道 Spring Boot JPA 入门(三)之基于注解查询

芋道 Spring Boot JPA 入门(三)之基于注解查询

作者头像
芋道源码
发布2019-12-13 18:22:25
1.1K0
发布2019-12-13 18:22:25
举报
文章被收录于专栏:芋道源码1024芋道源码1024

摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/JPA/ 「芋道源码」欢迎转载,保留摘要,谢谢!

  • 1. 概述
  • 2. 快速入门
  • 3. 分页操作
  • 4. 基于方法名查询
  • 5. 基于注解查询
  • 666. 彩蛋

5. 基于注解查询

虽然 Spring Data JPA 提供了非常强大的功能,可以满足绝大多数业务场景下的 CRUD 操作,但是可能部分情况下,我们可以使用在方法上添加 org.springframework.data.jpa.repository.@Query 注解,实现自定义的 SQL 操作。

如果是更新或删除的 SQL 操作,需要额外在方法上添加 org.springframework.data.jpa.repository.@Modifying 注解。

下面,我们来编写一个简单的示例。

5.1 UserRepository04

cn.iocoder.springboot.lab13.mybatis.repository 包路径下,创建 UserRepository04 接口。代码如下:

代码语言:javascript
复制
// UserRepository04.java

public interface UserRepository04 extends PagingAndSortingRepository<UserDO, Integer> {

    @Query("SELECT u FROM UserDO u WHERE u.username = ?1")
    UserDO findByUsername01(String username); // <1>

    @Query("SELECT u FROM UserDO u WHERE u.username = :username")
    UserDO findByUsername02(@Param("username") String username); // <2>

    @Query(value = "SELECT * FROM users u WHERE u.username = :username", nativeQuery = true)
    UserDO findByUsername03(@Param("username") String username); // <3>

    @Query("UPDATE UserDO  u SET u.username = :username WHERE u.id = :id")
    @Modifying
    int updateUsernameById(Integer id, String username); // <4>

}
  • <1> 处,使用 @Query 自定义了一个 SQL 操作,并且参数使用占位符(`?`) + 参数位置的形式。
  • <2> 处,和 <1> 类似,差异在于使用占位符(`:`) + 参数名字(需要使用 `@Param` 声明)的形式。
  • <3> 处,和 <2> 类似,差别在于我们增加了 nativeQuery = true ,表示在 @Query 自定义的是原生 SQL,而非在 <1><2> 自定义的是 JPQL 。进一步的说:
    • `<1>` 和 `<2>` 处,`FROM UserDO` ,使用的是实体名。
    • `<3>` 处,使用的是表名。
    • 对 JPQL 不是很了解的胖友,可以看看 《JPQL 的学习》 文章。
  • <4> 处,定义了更新操作,需要加上 @Modifying 注解。? 另外,我们发可以现,使用参数名时,可以不用配合 @Param 注解。

5.2 简单测试

创建 UserRepository04Test 测试类,我们来测试一下简单的 UserRepository04 的每个操作。代码如下:

代码语言:javascript
复制
// UserRepository04Test.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepository04Test {

    @Autowired
    private UserRepository04 userRepository;

    @Test
    public void testFindIdByUsername01() {
        UserDO user = userRepository.findByUsername01("yunai");
        System.out.println(user);
    }

    @Test
    public void testFindIdByUsername02() {
        UserDO user = userRepository.findByUsername02("yunai");
        System.out.println(user);
    }

    @Test
    public void testFindIdByUsername03() {
        UserDO user = userRepository.findByUsername03("yunai");
        System.out.println(user);
    }

    @Test
    // 更新操作,需要在事务中。
    // 在单元测试中,事务默认回滚,所以胖友可能怎么测试,事务都不更新。
    @Transactional
    public void testUpdateUsernameById() {
        userRepository.updateUsernameById(5, "yudaoyuanma");
    }

}

具体的,胖友可以自己跑跑,妥妥的。

对于分页操作,需要在 @Query 编写查询分页列表和记录总数两条 SQL 。示例如下:

代码语言:javascript
复制
public interface UserRepository extends JpaRepository<User, Long> {

  @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1", // value 属性,编写查询分页列表的 SQL 。
    countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1", // countQuery 属性,编写记录总数的 SQL 。
    nativeQuery = true)
  Page<User> findByLastname(String lastname, Pageable pageable);

}

666. 彩蛋

? 本文仅仅是 Spring Data JPA 的简单入门,还有部分内容,胖友可以自己在去学习下:

  • 《Using JPA Named Queries》 ,可以使用 XML 自定义 SQL 操作。
  • 《Spring Data JPA 实现逻辑删除》 ,绝大多数业务场景下,我们不会使用 DELETE 物理删除,而是通过标志位进行逻辑删除。
  • 多表查询
    • 方式一:《JPA 多表查询的解决办法》
    • 方式二:《JPA 多表关联查询》
  • 《Spring Data JPA 使用 Example 快速实现动态查询》 艿艿,如果在这种情况下,Repository 需要继承 JpaRepository 接口。

如果胖友想找一个完整的,使用 JPA 的项目,可以看看 Apollo 。它是携程开源的配置中心,目前最好用的配置中心,基本没有之一,嘿嘿。

推荐阅读:

  • 《性能测试 —— MySQL 基准测试》
  • 《芋道 Spring Boot 多数据源(读写分离)入门》 对应 lab-17 。
  • 《芋道 Spring Boot 分库分表入门》 对应 lab-18 。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 芋道源码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 5. 基于注解查询
    • 5.1 UserRepository04
      • 5.2 简单测试
      • 666. 彩蛋
      相关产品与服务
      微服务引擎 TSE
      微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档