使用Java对关系数据库运行本机查询常常会使源代码变得混乱和繁杂,因为过滤条件太多,而且表绑定也发生了变化。
因此,我决定创建“Spring Native Query”库,以方便执行本机查询,重点是简化源代码,使其更具可读性和干净性,创建包含本机查询的文件,并动态注入 assets
以执行这些查询。
该库的思想是运行约定查询,类似于Spring数据,并且只用于springboot和Spring Data Jpa。
在创建扩展NativeQuery接口的新接口时,我们从这些接口创建假对象,使用代理拦截方法调用并执行查询,最后动态注册这些接口的bean,以便将这些接口注入到Spring的所有组件中。
约定的工作方式如下:方法名是包含sql查询的文件名,方法的参数将作为参数传递给实体管理器,方法返回是将使用查询返回的结果转换的对象。
包含SQL查询的文件是Jtwig模板,我们可以在其中应用验证修改整个查询、添加过滤器、更改表之间的链接,最后是SQL中的任何更改。
默认情况下,必须将本机查询文件添加到资源文件夹中名为“nativeQuery”的文件夹中。请记住,文件名必须与方法名相同。
在上面的1.0.28版本中,我们开始使用Hibernate类型来正确转换数据类型,对于以前的版本,请考虑通过下面的配置禁用Hibernate类型的使用。
native-query.use-hibernate-types=false
代码示例
下面是一些更好理解的例子。让我们创建一个springboot项目,其中包含依赖项、springdatajpa和H2数据库。在启动项目时,让我们通过创建一个新表并插入一些记录来创建一个sql脚本。所有示例源代码都在github中。
在您的项目中添加库的依赖项,让我们以maven为例。
<dependency> <groupId>io.github.gasparbarancelli</groupId> <artifactId>spring-native-query</artifactId> <version>1.0.28</version> </dependency>
在资源文件夹中创建一个名为 data.sql
的文件并插入脚本。
CREATE TABLE USER ( cod INT NOT NULL, full_name VARCHAR(45) NULL, active INT NULL, PRIMARY KEY (cod) ); INSERT INTO USER (cod, full_name, active) VALUES (1, 'Gaspar', 1), (2, 'Elton', 1), (3, 'Lucini', 1), (4, 'Diogo', 1), (5, 'Daniel', 1), (6, 'Marcos', 1), (7, 'Fernanda', 1), (8, 'Maicon', 1), (9, 'Rafael', 0);
首先在配置文件中定义项目的包扫描,支持文件 application.properties
、 bootstrap.properties
、 application.yaml
、 application.yml
、