作者简介
陈喆,现就职于中科院某研究所担任副研究员,专注于工业云平台、MES系统的设计与研发。
本例使用<named-query/>元素和@NamedQuery注解,对应的查询需要使用JPA查询语言定义。也可以使用<named-native-query/>或@NamedNativeQuery。这样可以使用原生SQL,但这样会丧失数据库平台独立性。
XML定义命名查询
使用XML配置,向位于META-INF文件夹下的orm.xml配置文件添加必要的<name-query/>元素。
<named-query name="User.findByLastname">
<query>select u from User u where u.lastname = ?1</query>
</named-query>
基于注解定义命名查询
基于注解的配置可以免于编辑额外的配置文件,降低维护成本。但需要你在每次声明新查询的时候重新编译实体类。
@Entity
@NamedQuery(name = "User.findByEmailAddress",
query = "select u from User u where u.emailAddress = ?1")
public class User {
}
声明接口
要使用上面定义的命名查询,需要定义到UserRepository接口中:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByLastname(String lastname);
User findByEmailAddress(String emailAddress);
}
Spring Data尝试处理这些方法对命名查询的调用,以实体类名称开始,后接方法名,以点作连接符。所以NameQuery定义在实体上,而不是定义在方法上。