在 Spring Boot 中将SQL语句定义在xml文件中

在开发 Spring Boot Data JPA 类型的应用中,通常将HSQL或本地SQL(Native SQL)直接写在对应的Repository类中。但如果希望将这些SQL预计剥离出来放在分离文件中以便于维护,则可以采用本文介绍的方法。

本文中使用 Spring Boot 构建Rest服务实验手册(一) 中的案例进行演示。

定义存放SQL的文件

该功能通过命名SQL来实现,在 Spring Boot 中,可以支持用 properties 或 xml 文件来存储命名的SQL。

首先需要建立该文件,我们以 xml 文件为例:

  1. 在 src/main/resources 目录下新建名为: META-INF 的目录。

  2. 在该目录下新建名为: 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);
}

本文标题:在 Spring Boot 中将SQL语句定义在xml文件中

文章作者:Morning Star

发布时间:2019年12月15日 - 07:12

最后更新:2021年04月16日 - 15:04

原始链接:https://www.mls-tech.info/java/springboot-jpa-sql-in-xml/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。