Spring Data JPA中常用的查询方式

Spring Data JPA 为查询数据库提供了多种方式,既简化了开发,又提供了足够的灵活性。

本文中使用 Spring Boot 构建Rest服务实验手册(一) 中的案例演示JPA的不同查询方法。

认识Repository

在 Spring Data JPA 中,使用 Repository 接口代替了传统的 DAO 对象,其原来其实还是一样的,只是这样做能极大的简化开发。

比如在案例中 TodoRepository 的定义:

1
2
3
@Repository
public interface TodoRepository extends JpaRepository<Todo, Integer> {
}

通过简单的继承 JpaRepository, 不用写一行代码,就获得了基本的增、删、查、改Todo 对象(表)的能力。

使用 Query Method 定义查询

“Query Method” 是JPA中自动建立查询的一种机制,通过方法名来推断可能的查询参数。

例如,我们在案例中想要通过 Todo 的 Title 字段作为查询条件,就可以在Repository中这样来定义方法:

1
2
3
4
5
@Repository
public interface TodoRepository extends JpaRepository<Todo, Integer> {

public List<Todo> findByTitle(String title);
}

可以看到,其模式为 findBy<字段名>。 等价的 SQL 为:

1
select * from TODO t where t.title = ?

我们也可以查询多个条件,比如要根据 title 和 desc 两个属性来查询,则可以写成:

1
public List<Todo> findByTitleAndDesc(String title, String desc);

实际上,JPA中定义了很多这样的对于关系,如下表:

JPA Query Method 1
JPA Query Method 2
JPA Query Method 3

使用HSQL语法进行查询

HSQL是在 Hibernate 中定义的一种查询语法,该语法与 SQL 及其相似,所以使用起来也非常顺手。如果用HSQL实现上面例子中的基于Title来进行查询,则可以定义为:

1
2
3
4
5
6
@Repository
public interface TodoRepository extends JpaRepository<Todo, Integer> {

@Query("from Todo t where t.title = :title")
public List<Todo> findByTitle(@Param("title") String title);
}

*需要注意的是,在 “from” 后面,HSQL使用的是对象名,而不是表名**

使用本地SQL进行查询

为活动更好的,更精确的控制,也可以使用本地 SQL 进行查询,以上的例子可以写为:

1
2
3
4
5
6
@Repository
public interface TodoRepository extends JpaRepository<Todo, Integer> {

@Query(value = "select * from TODO t where t.title = ?1", nativeQuery = true)
public List<Todo> findByTitle(String title, Pageable pageable);
}

本文标题:Spring Data JPA中常用的查询方式

文章作者:Morning Star

发布时间:2019年12月14日 - 07:12

最后更新:2021年04月16日 - 15:04

原始链接:https://www.mls-tech.info/java/springboot-jpa-query/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。