Spring Data JPA创建查询的各种方法

1. 创建一个接口,并继承Repository类,然后通过解析方法的名称创建查询

例如下面的代码

public interface UserRepository extends Repository {
    List findByEmailAddressAndLastname(String emailAddress, String lastname);
}

findByEmailAddressAndLastname会转换为以下的查询:select u from User u where u.emailAddress = ?1 and u.lastname = ?2 ,因为JPA模块支持将查询从方法名称中解析。


下表描述了JPA支持的关键字以及包含该关键字的方法转换

关键词 示例 等效JPQL的片段
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is,Equals findByFirstname, findByFirstnameIs, findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age <= ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection ages) … where x.age not in ?1
True findByActiveTrue … where x.active = true
False findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

2. 使用JPA命名查询

可以使用基于XML或者基于注解的方式配置查询,两者是等效的

  • 基于XML的配置

  select u from User u where u.lastname = ?1

  • 基于注解的配置
@Entity
@NamedQuery(name = "User.findByEmailAddress",
  query = "select u from User u where u.emailAddress = ?1")
public class User {

}

然后声明接口,要允许执行以上的命名查询,需指定UserRepository如下

public interface UserRepository extends JpaRepository {

  List findByLastname(String lastname);

  User findByEmailAddress(String emailAddress);
}

3. 运用@Query注解

  • 一般查询
public interface UserRepository extends JpaRepository {

  @Query("select u from User u where u.emailAddress = ?1")
  User findByEmailAddress(String emailAddress);
}
  • 使用命名参数
public interface UserRepository extends JpaRepository {

  @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")
  User findByLastnameOrFirstname(@Param("lastname") String lastname,
                                 @Param("firstname") String firstname);
}
  • 使用SpEL表达式
@Entity
public class User {

  @Id
  @GeneratedValue
  Long id;
  String lastname;
}

public interface UserRepository extends JpaRepository {

  @Query("select u from #{#User} u where u.lastname = ?1")
  List findByLastname(String lastname);
}

参考资料:Spring Data JPA - 参考文档

你可能感兴趣的:(Spring Data JPA创建查询的各种方法)