在开发 Spring Boot Data JPA 类型的应用中,通常将HSQL或本地SQL(Native SQL)直接写在对应的Repository类中。但如果希望将这些SQL预计剥离出来放在分离文件中以便于维护,则可以采用本文介绍的方法。
本文中使用 Spring Boot 构建Rest服务实验手册(一) 中的案例进行演示。
定义存放SQL的文件 该功能通过命名SQL来实现,在 Spring Boot 中,可以支持用 properties 或 xml 文件来存储命名的SQL。
首先需要建立该文件,我们以 xml 文件为例:
在 src/main/resources 目录下新建名为: META-INF 的目录。
在该目录下新建名为: orm.xml 的文件,内容如下:
1 2 3 4 5 6 7 8 <?xml version="1.0" encoding="UTF-8"?> <entity-mappings version ="2.0" xmlns ="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd " ></entity-mappings >
添加SQL语句 添加一个HSQL 1 2 3 <named-query name ="Todo.findWithDesc" > <query > SELECT t FROM Todo t WHERE t.desc LIKE ?1</query > </named-query >
为Todo对象定义了一个名为: findWithDesc 的命名HSQL
添加一个本地SQL 1 2 3 4 <named-native-query name ="Todo.findWithNativeSQL" result-class ="cn.com.hohistar.spbt.todoapi.model.Todo" > <query > SELECT * FROM TODO t WHERE t.title = :title</query > </named-native-query >
为Todo对象定义了一个名为: findWithNativeSQL 的命名Native SQL
在Repository中使用 在Repository定义中,可以简单的按照名字匹配的方法来使用这些命名SQL,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Repository public interface TodoRepository extends JpaRepository <Todo , Integer > { public List<Todo> findByTitle (String title) ; public List<Todo> findByTitleAndDesc (String title, String desc) ; public List<Todo> findByTitleOrDesc (String title, String desc) ; public List<Todo> findWithDesc (String desc) ; @Query (nativeQuery = true ) public List<Todo> findWithNativeSQL (@Param("title" ) String title) ; }