SpringBoot JPA实践之Named查询

JPA
placeholder image
admin 发布于:2020-04-29 23:00:27
阅读:loading

本文不专业的称为以NamedQuery查询方式为Named查询或者叫命名查询,它的实现是将查询的JPQL及返回结果集类型等信息预定义在Entity类的注解处,通过预先定义的名称和sql语句的方式实现传递名称查询。其实Named查询我一直不太喜欢,有见过但是并未使用过,也不知道它与@Query查询相比哪个更好,本次耗费大量心血来牛刀小试一下(本文所涉及的命名查询均是以为原生SQL查询,对于JPQL的略过),详细参见下文。

定义Entity

image.png

测试查询调用

image.png

XML定义命名查询

Springboot jpa提供的Named查询可支持将SQL语句写至XML文件当中,这个特点使得我眼前一亮,其实我还是比较倾向将SQL与Java代码分离的,于是就深入的查阅各种资料,无奈资料还是比较少的,特此实践之,将整个过程详细整理分享,其实很多博客文章中都有涉及将Named查询时的SQL定义在xml中,但是都是蜻蜓点水,适可而止,没有深入实现,可以参考官网的资料 https://docs.jboss.org/hibernate/orm/6.0/userguide/html_single/Hibernate_User_Guide.html#sql-named-queries ,对于一般选手来说真的只是存粹的了解,因为它不是一个完整的入门了解示例,废话少说,完整示例实现如下。

配置orm.xml文件地址

有资料说默认orm.xml文件是在resources目录下,但笔者喜欢按自定义路径来存储,参考配置如下:

image.png

orm文件配置

<?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://www.oracle.com/webfolder/technetwork/jsc/xml/ns/persistence/orm_2_2.xsd "
>

    <
named-native-query name="XML_User.query_by_name_email" result-class="cn.chendd.example.jpa.user.entity.User">
        <
description>查询用户所有数据</description>
        <
query>select id , name , email , sex , createTime from {h-catalog}user</query>
    </
named-native-query>

</
entity-mappings>

Entity

Entity见上文中的User类

Test测试类

image.png

自定义DTO查询

定义SQL名称

image.png

自定义DTO

image.png

总结

(1)@NamedNativeQuery 查询的resultClass必须为Entity,并且查询的时候必须为全部的字段,不能为一部分字段;

(2)@NamedNativeQuery 查询语句支持内置的3个表达式,如{h-catalog};

(2)Named查询可支持从指定xml从配置文件中读取配置,支持named-query与named-native-query相关的接口;

(4)Name查询可支持返回自定义DTO对象查询;

(5)命名查询仅适合简单的单表查询;


 点赞


 发表评论

当前回复:作者

 评论列表


留言区