`
okcomputer2009
  • 浏览: 35139 次
  • 性别: Icon_minigender_1
  • 来自: singapore
社区版块
存档分类
最新评论

JPA本地查询(Native Query)的总结2

    博客分类:
  • JPA
阅读更多

OK,现在对同一个查询,再把结果集全部映射进实体对象。

 

首先

@NamedNativeQueries

(

    {

       @NamedNativeQuery(

           name="ReturnOrderListWithFullEntityType",

              query="select o.id as order_id,o.create_date as order_creation_date,o.description as order_description,o.sum_price as order_sum_total,

c.name as customer_name,c.ctype as customer_type,c.id as customer_id from orders o join customer c on o.cust_id=c.id where o.cust_id=?1",

           resultSetMapping="ReturnOrderListWithFullEntityType"),

        。。。。。。。。。。。。。可能还有更多的本地查询设置

}

)

改变本地查询的resultSetMapping

 

    @SqlResultSetMapping

    (

       name="ReturnOrderListWithFullEntityType",

       entities=

       {

           @EntityResult

           (

              entityClass=entity.Order.class,

              fields=

              {

    @FieldResult(name="id",column="order_id"),

                         @FieldResult(name="date",column="order_creation_date"),

                  @FieldResult(name="desc",column="order_description"),

    @FieldResult(name="sum",column="order_sum_total")

              }

           ),

 

           @EntityResult

           (

              entityClass=entity.Customer.class,

              discriminatorColumn="customer_type",

              fields=

              {

                  @FieldResult(name="id",column="customer_id"),

                  @FieldResult(name="name",column="customer_name")

              }

           )

       },

       columns={}

    )

 

entities属性是一个包含与返回结果集相映射的所有实体的一个数组。这条查询得到了订单和用户的信息,所以,与结果集映射的实体,就应该是OrderCustomer

每一个映射实体用@EntityResult表示,entityClass表示实体类,fields表示该实体类中的属性,与查询结果中的哪些个列相映射。而每一个“属性<->列”的映射关系,又保存在@FieldResult里面。name是实体属性,column是查询列(或列别名)

 

要注意的是,如果要将结果集映射到实体对象,则

1Select 语句中必须包含实体所映射的表中的PK,也就是 select o.id as order_id

 

2. 反过来,“属性<->列”的映射,也必须将表的PK映射到实体类的用@Id annotation批注的字段或属性上。

 

否则,JPA就会抛出一个exception

oracle.toplink.essentials.exceptions.QueryException

Exception Description: The primary key read from the row [DatabaseRecord(

    orders.ID => null

    orders.CREATE_DATE => 2009-05-27 00:00:00.0

    orders.SUM_PRICE => 36817.0

    orders.DESCRIPTION => This is an order creation example.

    orders.cust_id => null)] during the execution of the query was detected to be null.  Primary keys must not contain null.

 

 

 

 

 

再看一下关于Customer实体的映射,与Order不一样的地方,是discriminatorColumn="customer_type" (可能为列别名)

加上这个属性的原因是,Customer类是一个父类,以供其他子类继承,而J PA的内在多态性机制将会获取到Customer的实际类型。根据J PA @Inheritance批注,得知,父类实体的表中必须有一个字段(默认为DTYPE)来表示各个子类的类型。所以当要将查询结果集保存为实体的时候,它必须要知道你所保存的这个Customer实体到底是哪种类型。

所以,你还必须在select子句中取得这个Discrimator Type的字段。

否则又会抛出异常: 

oracle.toplink.essentials.exceptions.QueryException

Exception Description: Custom SQL failed to provide descriminator column : , as defined in SQLResultSetMapping : ReturnOrderListWithFullEntityType.

或者:

oracle.toplink.essentials.exceptions.QueryException

Exception Description: Custom SQL failed to provide descriminator column : customer_type, as defined in SQLResultSetMapping : ReturnOrderListWithPartEntityPartScalarType.

 

 

通过这种映射方式,我们可以推测,得到的结果集List中,数据会是这样:

[  {“Order对象1”, “Customer对象1”},  {“Order对象2”, “Customerr对象2”}, ……  ]

 

经过运行测试程序,得到了我们的推论

 

*****ReturnOrderListWithFullEntityType*****

entity.Order@48edb5  entity.GoldenCustomer@1ee2c2c  

entity.Order@1402d5a entity.GoldenCustomer@1ee2c2c  

entity.Order@1e13e07 entity.GoldenCustomer@1ee2c2c  

entity.Order@9cfec1  entity.GoldenCustomer@1ee2c2c  

entity.Order@747fa2  entity.GoldenCustomer@1ee2c2c  

……

看来的确是保存了对象,而且注意第二个对象不是Customer而是GoldenCustomer,这说明,JPA自动将数据映射进了GoldenCustomer实体(尽管我们使用的是Customer实体进行保存  entityClass=entity.Customer.class”

分享到:
评论

相关推荐

    SpringDataJpa 动态复杂查询NativeQuery

    SpringDataJpa 动态复杂查询NativeQuery emm挺长时间没更新了,最近在忙项目,外加搬家,后续会继续更新 遇到一个复杂的sql查询,在不通过外键关联的情况下,只能选择使用原生sql的方式查询,但是遇到一个极其XX的...

    使用JPA中@Query 注解实现update 操作方法(必看)

    2", nativeQuery = true) int updateStatusById(String status, String id); ``` 1. **@Query**:这是主要的注解,它接收一个字符串参数,这个字符串是更新语句。在本例中,我们使用的是原生的SQL语句(因为`native...

    Java工作笔记-JPA中使用@query注解(分页查询实例)

    总结来说,JPA中的@Query注解允许开发者灵活地执行自定义SQL查询,结合Pageable接口可以轻松实现分页查询。在处理大量数据时,这种分页策略能够显著提高应用的性能和用户体验。通过理解并掌握这些知识,开发者可以更...

    Spring Data JPA入门项目02

    6. 原生查询:对于JPA无法处理的复杂查询,Spring Data JPA还提供了`@Query nativeQuery = true`选项,允许我们编写原生的SQL查询。 在"Spring Data JPA入门项目02"中,你将学习如何在实际项目中应用这些概念,创建...

    详解Spring Data JPA使用@Query注解(Using @Query)

    value 参数指定查询语句,而 nativeQuery 参数指定是否使用原生 SQL 语句。 使用 @Query 注解的优点: * 可以使用 JPQL 语句或原生 SQL 语句来定义查询语句 * 可以使用参数来定义查询语句 * 可以使用 @Param 注解...

    使用JPA时@Query中的insert语句之对象传参

    在处理复杂查询时,我们可以利用Spring Data JPA中的`@Query`注解来编写自定义SQL或者HQL(Hibernate Query Language)语句。本篇文章将深入探讨如何在`@Query`中使用对象参数进行INSERT操作。 首先,让我们理解...

    spring boot query查询

    4. **原生SQL**:`@Query`还支持执行原生SQL查询,只需在HQL查询前添加`nativeQuery = true`。 总的来说,Spring Boot提供了多种查询方式,`@Query`注解是其中一种强大的工具,它允许开发者灵活地定制查询逻辑,以...

    Open JPA2 employee 简单例子

    OpenJPA2还提供了查询语言JPA QL(Java Persistence Query Language),可以用来执行更复杂的查询。此外,OpenJPA2支持懒加载、级联操作、缓存策略等高级特性,这些在实际项目中都是很实用的功能。 通过这个简单的...

    SpringData@Query的注释的代码实现

    除了HQL,`@Query`也支持原生的SQL查询,只需要在查询字符串前加上`nativeQuery = true`即可: ```java @Query(value = "SELECT * FROM users WHERE id = ?1", nativeQuery = true) User findUserById(Long id); ``...

    Spring Data JPA.zip

    通过 `@Query` 注解可以在 Repository 方法上添加自定义的 JPQL 或 Native SQL 查询。 **9. 分页与排序** Spring Data JPA 提供了分页和排序的支持,可以通过 `Pageable` 参数实现。 **10. 异常处理** 在使用 ...

    使用SpringBoot-JPA进行自定义保存及批量保存功能

    @Query(value = "INSERT INTO t_student(seq, name, sex) VALUES (getseq('student_seq'), :#{#student.name}, :#{#student.sex})", nativeQuery = true) int insert(@Param("student") StudentDO student); ``` ...

    JPA2.0高级教程

    - **JPQL**:Java Persistence Query Language,一种面向对象的查询语言,类似于SQL但更加面向对象。 - **Criteria API**:提供了一种类型安全的方式构建查询,适用于复杂的查询场景。 - **Native SQL**:直接执行...

    Spring Data JPA分页复合查询原理解析

    例如,使用@Query(value="select * from C_Article where type=:type \n--#pageable\n",countQuery="select count(*) from C_Article where type=:type",nativeQuery=true)可以实现分页查询。但是,需要注意的是,在...

    spring data jpa 最新文档 2012

    此外,`@NativeQuery`可以用来执行SQL原生查询。 **6. 抽象Repository** 为了减少重复的Repository接口定义,Spring Data JPA提供了基类,如`PagingAndSortingRepository`,它增加了分页和排序的功能。开发者可以...

    Spring Data Jpa – 获得实体类部分字段(单表或多表)

    @Query(value = select username from user,nativeQuery = true) // 注意返回值用String类型接收,也可以使用Object String findOneUserName(); 二、单表查询的一个字段、多条数据 @Query(value = select distinct ...

    Native-SQL查询 (1).ppt

    总结来说,Native SQL查询在Hibernate中提供了对数据库的直接访问,允许开发者利用SQL的强大功能,同时保持了与ORM框架的兼容性。虽然HQL通常更为简便且易读,但在处理复杂查询或充分利用数据库特性时,Native SQL是...

    Spring Data JPA从入门到精通

    2. **Spring Data JPA概述**:Spring Data JPA是Spring框架的一个模块,它为JPA提供了一种统一的访问数据的方式,包括基于注解的CRUD操作、复杂的查询方法等。通过Spring Data JPA,开发者可以减少大量的样板代码,...

    IBM最新spring2.0+JPA教程加源代码

    JPA 2.0 版本引入了更多的功能,如 Criteria 查询、 NamedQuery 和 Native Query,以及支持多态性、延迟加载等高级特性。 在Spring 2.0中集成JPA,可以利用Spring的数据访问抽象层,如JdbcTemplate和...

    springboot-native-query-demo:Spring Boot本机查询演示

    2. **Repository接口**:Spring Data JPA提供了一种声明式的方式处理数据库查询,但在需要使用原生SQL查询时,我们可以创建一个继承自`JpaRepository`的接口,并使用`@Query`注解标记包含SQL的抽象方法。 3. **实体...

Global site tag (gtag.js) - Google Analytics