在 Spring Data JPA 1.4 以后,支持在 @Query 中使用 SpEL 表达式(简介)来接收变量。
SpEL 支持的变量
变量名 | 使用方式 | 描述 |
entityName | select x from #{#entityName} x | 根据指定的Repository自动插入相关的entityName |
有两种方式能被解析出来:
如果定了 @Entity 注解,直接用其属性名。
如果没定义,直接用实体的类的名称。
在以下的例子中,我们在查询语句中插入表达式:
@Entity("User")
public class User {@Id@GeneratedValueLong id;String lastname;
}
//Repository写法
public interface UserRepository extends JpaRepository<User, Long> {@Query("select u from #{#entityName} u where u.lastname = ?1")List<User> findByLastname(String lastname);
}
这个 SPEL 的支持,比较适合自定义的 Repository,如果想写一个通用的 Repository 接口,那么可以用这个表达式来处理:
@MappedSuperclass
public abstract class AbstractMappedType {…String attribute;
}
@Entity
public class ConcreteType extends AbstractMappedType { …
}
@NoRepositoryBean
public interface MappedTypeRepository<T extends AbstractMappedType> extends Repository<T, Long> {@Query("select t from #{#entityName} t where t.attribute = ?1")List<T> findAllByAttribute(String attribute);
}
public interface ConcreteRepository extends MappedTypeRepository<ConcreteType> { …
}
MappedTypeRepository 作为一个公用的父类,自己的 Repository 可以继承它,当调用 ConcreteRepository 执行 findAllByAttribute 方法的时候执行结果如下:
select t from ConcreteType t where t.attribute = ?1