JPA支持本地查询,所谓本地查询,就是使用原生的sql语句(根据数据库的不同,在sql的语法或结构方面可能有所区别)进行查询数据库的操作。
public interface EntityManager {
public void persist(Object entity);
public <T> T find(Class <T> entityClass, Object primaryKey);
public <T> T getReference(Class <T> entityClass, Object primaryKey);
public <T> T merge(T entity);
public void remove(Object entity);
public void lock(Object entity, LockModeType lockMode);
public void refresh(Object entity);
public boolean contains(Object entity);
public void clear( );
public void joinTransaction( );
public void flush( );
public FlushModeType getFlushMode( );
public void setFlushMode(FlushModeType type);
public Query createQuery(String queryString);
public Query createNamedQuery(String name);
public Query createNativeQuery(String sqlString);
public Query createNativeQuery(String sqlString, String resultSetMapping);
public Query createNativeQuery(String sqlString, Class resultClass);
public Object getDelegate( );
public void close( );
public boolean isOpen( );
}
即 createNativeQuery方法的三种形式,但用这个方法的缺点是,要将查询的sql语句及返回结果集类型传递进去。还有一种方法是使用createNamedQuery,这样就可以避免在这里直接写入sql语句以及返回的结果集类型等参数,而可以在相关的Entity类里对这些信息进行配置。
@SqlResultSetMappings(
{
@SqlResultSetMapping
(
name="ReturnOrderListWithFullScalarType",
entities={},
columns=
{
@ColumnResult(name="order_id"),
@ColumnResult(name="order_creation_date"),
@ColumnResult(name="order_description"),
@ColumnResult(name="order_sum_total"),
@ColumnResult(name="customer_id"),
@ColumnResult(name="customer_name")
}
),
// 。。。。。。。。。。。。。可能还有更多的结果集映射设置
})
针对每一个本地查询的返回值,都有一个结果集和它映射。它可以返回
1. 实体(包括不同类型的实体,即多个实体) Entity
2. 标量值 Scalar
3. 实体与标量值的组合 Entity+Scalar
默认情况下,JPA假设原生sql查询中select语句将会:
1. 返回一个实体类型
2. 包含与返回的实体的所有字段或属性相对应的所有列,即列名和实体属性/字段名一样
3. 查询中没有用列名别名,column alias,即没有用 AS 指定别名
@SqlResultSetMappings,如果在一个实体类中有多个@NamedNativeQuery的话,必然就有多个结果集映射@SqlResultSetMapping。在这种情况下,必须使用该批注,并且将单个的SqlResultSetMapping都作为SqlResultSetMappings数组中的一个元素。
@SqlResultSetMapping,关于结果集映射的详细信息。
name 表示该结果集映射的名字,与@NamedNativeQuery中的resultSetMapping="ReturnOrderListWithFullScalarType"的值相对应。
entities表示查询结果集会被映射进实体,如果有就要将所有返回的实体一一列出(这里我们将结果集全部映射进标量,所以entities属性是个空数组)。
columns表示将被映射进标量的结果集中的各个列。
这里要说一下标量(Scalar)这个概念。在物理学上,标量与矢量(Vector)是相互对应的,矢量是既有方向又有大小的量,而标量是只有大小的量。在此处,Scalar的含义与物理学上的定义差不多,Scalar可以认为是一个没有属性/方法的单纯的常量(可以想象为java数据类型的primitive type),而与它相对的则是有方法/属性的对象(object type)。那么采用这种映射机制,我们从数据库取来的每一条记录的每一个字段,仅仅是被单纯的作为一个常量,保存在每一个columnResult中。
@ ColumnResult,就是指在sql语句中,将哪些查询的列保存进来。每一个@ColumnResult对应一个列,name="order_id" ,注意,如果在select的时候,用AS 制定了列的别名,“order_id” 则表示的是别名。
这种映射方式比较简单,我们可以推测,得到的结果集List中,数据会是这样:
[ {“列1”, “列2”, “列3”, …}, {“列1”, “列2”, “列3”, …}, …… ]
经过运行测试程序,得到了我们的推论
*****ReturnOrderListWithFullScalarType*****
52 2009-05-27 00:00:00.0 This is an order creation example. 36817.0 39 John Smith
55 2009-05-27 00:00:00.0 This is an order creation example. 3347.0 39 John Smith
……
将结果集全部映射进标量,是比较简单的一种做法,在SqlResultSetMapping的写法上也没有太多需要注意的地方。
分享到:
相关推荐
SpringDataJpa 动态复杂查询NativeQuery emm挺长时间没更新了,最近在忙项目,外加搬家,后续会继续更新 遇到一个复杂的sql查询,在不通过外键关联的情况下,只能选择使用原生sql的方式查询,但是遇到一个极其XX的...
Jpa详细查询实例介绍,教你如何使用JPA,简单,分类实例。
JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询...
jpa查询 jpql 本地查询 命名查询
JPA 使用@Query注解实现JPQL和本地自定义查询 JPA API 条件查询 (子查询,多表连接查询) JPA结合QueryDSL轻松完成复杂查询(自连接,多表连接查询) 参与文档: Pro JPA2中文版:精通Java持久化API 优秀博文读书笔记: ...
This tutorial show how to use Hibernate/JPA Named Queries. We start by explaining why we would use named queries. Next, we show an example of how to use named queries, either with annotations or XML ...
时间宝贵,为了节约用者时间,该资源中包括4张已经建好的表:employee/department/phone/project/中间表,只需要下载添加至mysql数据库即可用
spring data jpa 的Specifications动态查询 单条件查询 多条件查询 分页查询
针对使用JPA方式操作数据库的复杂查询快速开发,复制代码直接使用,快速开发
下面小编就为大家分享一篇让JPA的Query查询接口返回Map对象的方法,具有很的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
包括:解析方法名称以自动生成查询、 NamedQueries、 @Query指定查询、本地查询、命名化参数、更新查询、创建查询的顺序等内容 第四章:客户化扩展JpaRepository 包括:讲述如何在JpaRepository基础上扩展我们自己...
springJpa单标递归树形结构
springboot结合jpa实现分页,动态多条件查询,使用thymeleaf前端渲染数据
jpa入门案例:单表查询,包括分页查询 使用springboot来整合实现
下面小编就为大家带来一篇在JPA的@Query注解中使用limit条件(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
JPA 动态查询 Criteria JPQL 语法详解 Java Persistence Query Language
JPA视频_映射双向一对一的关联关系 · 16. JPA视频_映射双向多对多的关联关系 · 17. JPA视频_二级缓存 · 18. JPA视频_JPQL_HelloWorld · 19. JPA视频_JPQL_查询缓存 · 20. JPA视频_JPQL_ORDER BY 和 GROUP...
SpringBoot是一款基于Spring框架的开发框架,而Spring-data-JPA是在Hibernate的基础上实现JPA规范的ORM框架。使用SpringBoot和Spring-data-jpa进行分页查询可以大大简化编码流程并提高开发效率。 在使用Spring-data...
10_JPA详解_JPA中的一对多双向关联与级联操作.zip
Spring Boot Native + JPA Spring Boot本机应用程序+ PostgreSQL + Rest的JPA失败的示例。项目结构项目是使用Spring Initializr创建的,后来添加了ProstgreSQL依赖关系和Java代码。项目包含: JpaRepository ...