Spring Data JPA 从入门到精通~SpEL表达式的支持

在 Spring Data JPA 1.4 以后,支持在 @Query 中使用 SpEL 表达式(简介)来接收变量。

SpEL 支持的变量

变量名

使用方式

描述

entityName

select x from #{#entityName} x

根据指定的Repository自动插入相关的entityName

有两种方式能被解析出来:

如果定了 @Entity 注解,直接用其属性名。

如果没定义,直接用实体的类的名称。

在以下的例子中,我们在查询语句中插入表达式:

@Entity("User")
public class User {
   @Id
   @GeneratedValue
   Long id;
   String lastname;
}
//Repository写法
public interface UserRepository extends JpaRepository {
   @Query("select u from #{#entityName} u where u.lastname = ?1")
   List findByLastname(String lastname);
}

这个 SPEL 的支持,比较适合自定义的 Repository,如果想写一个通用的 Repository 接口,那么可以用这个表达式来处理:

@MappedSuperclass
public abstract class AbstractMappedType {
   …
   String attribute;
}
@Entity
public class ConcreteType extends AbstractMappedType { …
}
@NoRepositoryBean
public interface MappedTypeRepository extends Repository {
   @Query("select t from #{#entityName} t where t.attribute = ?1")
   List findAllByAttribute(String attribute);
}
public interface ConcreteRepository extends MappedTypeRepository { …
}

MappedTypeRepository 作为一个公用的父类,自己的 Repository 可以继承它,当调用 ConcreteRepository 执行 findAllByAttribute 方法的时候执行结果如下:

select t from ConcreteType t where t.attribute = ?1

你可能感兴趣的:(JPA,Java,spring)