首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用NamedNativeQuery时,Hibernate不会初始化嵌套实体

。NamedNativeQuery是Hibernate中的一种查询方式,它允许开发人员使用原生SQL查询数据库。与HQL(Hibernate Query Language)相比,NamedNativeQuery可以更灵活地执行复杂的查询操作。嵌套实体是指实体类中包含其他实体类的属性。

在Hibernate中,当使用NamedNativeQuery进行查询时,默认情况下,Hibernate不会自动初始化嵌套实体。也就是说,执行查询语句后,如果查询结果中包含嵌套实体的属性,这些属性将会被设置为null。这是为了避免潜在的性能问题和数据冗余。

然而,如果需要获取嵌套实体的属性,可以通过使用Hibernate的Fetch关键字来显式指定。Fetch关键字可以控制在执行查询时是否同时初始化嵌套实体。例如,可以使用Fetch关键字来设置FetchMode.JOIN,这将强制Hibernate在执行查询时立即加载嵌套实体的属性。

以下是使用Hibernate Fetch关键字加载嵌套实体的示例代码:

代码语言:txt
复制
@NamedNativeQuery(
    name = "fetchQuery",
    query = "SELECT * FROM parent_table",
    resultClass = ParentEntity.class,
    hints = {
        @QueryHint(name = "org.hibernate.fetchSize", value = "100"),
        @QueryHint(name = "org.hibernate.readOnly", value = "true")
    }
)
@Entity
public class ParentEntity {
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
    private List<ChildEntity> children;
    // ...
}

在上述示例中,通过设置@OneToMany注解的fetch属性为FetchType.LAZY,并使用Fetch关键字来指定加载策略。这样可以在需要时才加载嵌套实体属性,避免不必要的性能开销。

总之,使用NamedNativeQuery时,Hibernate默认不会初始化嵌套实体。如有需要,可以通过Fetch关键字来显式指定加载策略。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Java 虚拟机原理】Java 类中的类加载初始化细节 ( 只使用类中的常量加载类不会执行到 ‘初始化‘ 阶段 )

, 即使没有执行 初始化 这个步骤 , 也不影响使用类中的常量值 ; 在 连接 的 准备 阶段 , 为 普通 的 静态变量 进行 默认赋值 , 但是针对 静态常量 , 直接进行 指定赋值 ; 但是 普通的...静态变量 的 指定赋值 , 是在 初始化 阶段 完成的 ; 类 在 " 初始化 " 阶段 , 调用 静态代码块 ; 二、常量加载示例 ---- 类加载 , 如果只用到了类中的常量 , 则只进行 "...18 , 这个常量值是在编译阶段就编译到了字节码中 ; 在 " 连接 " 的 " 准备 " 阶段 , 该常量值就设置完毕 ; 出于最大限度性能优化的考虑 , 如果不使用该类的其它值 , 就不会执行..., 如创建了一个对象数组 , 此时不会加载该对象对应的类 , 只会为其在内存分配空间 ; 创建数组 , 触发的是 Student[] 数组类型的 类加载初始化 , 但是不会触发 Student 类的初始化操作...; 如果调用数组中的元素 , 就需要初始化 Student 类 ; Student 类 : public class Student { // 常量 public static final

3.6K20
  • 如何实现Java后端数据校验?看这篇就足够!

    我们在编写控制层提供服务api,有些时候从前端传过来的参数较多,比较好的办法是定义一个实体类来封装请求参数,但是用实体类封装参数后,无法对参数值进行校验,可以使用spring的@Validated 结合...在检验Controller的入参是否符合规范使用@Validated或者@Valid在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不同: 1....顾名思义,嵌套验证就是一个实体中的属性包含其他实体,在对当前实体做校验的同时,还要对其属性的实体进行嵌套验证,比如,我们现在有一个实体CreateRoomInfoVO,通过Java+Hibernate校验...和objectVOList的字段做非空校验,不会对CreateRoomInfoVO字段里的ObjectVO实体vipLevel字段做等级校验,也就是@Validated和@Valid加在方法参数前,都不会自动对参数进行嵌套验证...@Validated和@Valid注解的使用区别 @Validated:提供分组校验功能,可以在入参的,根据不同的分组用不同的校验机制,用在方法入参上无法单独提供嵌套验证功能。

    13.4K72

    JPAHibernate问题汇总

    项目使用的是SpringBoot框架,JPA默认使用的是hibernate的实现,而hibernate的懒加载机制其实就是延迟加载对象,如果没有在session关闭前使用到对象里除id以外的属性,就只会返回一个没有初始化过的包含了...如果接下来没有其他的操作去访问这个代理对象除了id以外的属性,就不会初始化这个代理对象,也就不会去发出sql查找db。接着事务提交,session关闭。...如果这时候再去访问代理对象除了id以外的属性,就会报上述的懒加载异常,原因是这时候已经没有session了,无法初始化懒加载的代理对象。...懒加载导致的N + 1问题 Hibernate的懒加载有个让人诟病的问题,就是所谓的N + 1问题:如果一个实体里存在一个懒加载的集合对象,在查询该实体,会发出一条SQL。...但是,JPA默认实现是Hibernate,而Hibernate不提供事务嵌套

    2.5K20

    Spring-Data-Jpa基础用法

    他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面。...值得注意的是,JPA是在充分吸收了现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点。...具体的创建查询的命名如下: image.png 预定义查询(@NamedQuery) 还可以自己预定义查询方法 预定义查询有两种,一种是通过XML配置或配置@NamedQuery,另一种是通过XML配置或配置@NamedNativeQuery...如果查询直接是Select C from Customer c,这时候,查询的返回对象就是Customer这个完整的对象,包含所有字段,对于我们的示例并没有什么问题,但是对于比较庞大的domain类,这个查询就比较要命...projection就会只返回projection定义的属性,不会返回所有 多表查询 多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询后的结果

    73720

    你不一定会用的JPA(Hibernate)的fetch all properties

    道理很简单:程序去加载Person实体,每个Person实体可能存在多个关联的Email地址,因此程序没必要在加载Person实体,立即加载它关联的全部Email地址。...如果你希望JPA(Hibernate)在底层使用多表连接语句抓取集合属性(包括关联实体),你需要显式使用"xxx join"或“xxx join fetch”来执行连接,单纯地使用“fetch all...all properties 来强制Hibernate立即初始化这些属性。...基于字节码增强的延迟加载 大部分的JPA(hibernate使用者对延迟加载并不陌生: 默认情况下,对于集合属性或关联实体是多个(1-N或N-N关联),JPA(hibernate)自动就会启用延迟加载...fetch all properties选项,因此程序查询Person实体(该Preson实体使用了字节码增强),程序会对name属性执行延迟加载,这样程序在Session关闭后获取Person实体

    1.8K20

    hibernate延迟加载详解

    集合属性的延迟加载 当 Hibernate 从数据库中初始化某个持久化实体,该实体的集合属性是否随持久化类一起初始化呢?...对于关联实体,可以将其分为两种情况: 关联实体是多个实体(包括一对多、多对多):此时关联实体将以集合的形式存在,Hibernate使用 PersistentSet、PersistentList、PersistentMap...使用 Javassist 项目动态生成的代理类——当 Hibernate 延迟加载关联实体,将会采用 Javassist 生成一个动态代理对象,这个代理对象将负责代理“暂未加载”的关联实体。...当应用程序真正需要使用关联实体,代理对象会负责从底层数据库抓取记录,并初始化真正的关联实体。...与此完全类似的是,Hibernate 也是通过代理模式来“推迟”加载关联实体的时间,如果程序并不需要访问关联实体,那程序就不会去抓取关联实体了,这样既可以节省系统的内存开销,也可以缩短 Hibernate

    1.4K30

    求求你别在用IF ELSE校验参数了

    2.为什么使用Hibernate Validator 提高代码整洁度; 验证逻辑与业务逻辑之间进行了分离,降低了程序耦合度; 统一且规范的验证方式,无需你再次编写重复的验证代码; 你将更专注于你的业务,...没有添加分组属性,默认验证没有分组的验证属性(Default分组); @Validated:可以用在类型、方法和方法参数上,但是不能用在成员属性(字段)上; @Validated:用在方法入参上无法单独提供嵌套验证功能...能配合嵌套验证注解@Valid进行嵌套验证。...@Valid:作为标准JSR-303规范,还没有吸收分组的功能; @Valid:可以用在方法、方法参数、构造函数、方法参数和成员属性(字段)上; @Valid加在方法参数并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上...比如一个User对象,新增的时候不需要检验id(系统生成),修改的时候需要检验id属性,要想复用Class,就可以使用Hibernate Validator的分组。

    1.7K20

    求求你别在用IF ELSE校验参数了

    2.为什么使用Hibernate Validator 提高代码整洁度; 验证逻辑与业务逻辑之间进行了分离,降低了程序耦合度; 统一且规范的验证方式,无需你再次编写重复的验证代码; 你将更专注于你的业务,...没有添加分组属性,默认验证没有分组的验证属性(Default分组); @Validated:可以用在类型、方法和方法参数上,但是不能用在成员属性(字段)上; @Validated:用在方法入参上无法单独提供嵌套验证功能...能配合嵌套验证注解@Valid进行嵌套验证。...@Valid:作为标准JSR-303规范,还没有吸收分组的功能; @Valid:可以用在方法、方法参数、构造函数、方法参数和成员属性(字段)上; @Valid加在方法参数并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上...比如一个User对象,新增的时候不需要检验id(系统生成),修改的时候需要检验id属性,要想复用Class,就可以使用Hibernate Validator的分组。

    1.9K10

    求求你别在用IF ELSE校验参数了

    2.为什么使用Hibernate Validator 提高代码整洁度; 验证逻辑与业务逻辑之间进行了分离,降低了程序耦合度; 统一且规范的验证方式,无需你再次编写重复的验证代码; 你将更专注于你的业务,...没有添加分组属性,默认验证没有分组的验证属性(Default分组); @Validated:可以用在类型、方法和方法参数上,但是不能用在成员属性(字段)上; @Validated:用在方法入参上无法单独提供嵌套验证功能...能配合嵌套验证注解@Valid进行嵌套验证。...@Valid:作为标准JSR-303规范,还没有吸收分组的功能; @Valid:可以用在方法、方法参数、构造函数、方法参数和成员属性(字段)上; @Valid加在方法参数并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上...比如一个User对象,新增的时候不需要检验id(系统生成),修改的时候需要检验id属性,要想复用Class,就可以使用Hibernate Validator的分组。

    1.8K20

    Validator,就来这一篇吧

    2.为什么使用Hibernate Validator 提高代码整洁度; 验证逻辑与业务逻辑之间进行了分离,降低了程序耦合度; 统一且规范的验证方式,无需你再次编写重复的验证代码; 你将更专注于你的业务,...没有添加分组属性,默认验证没有分组的验证属性(Default分组); @Validated:可以用在类型、方法和方法参数上,但是不能用在成员属性(字段)上; @Validated:用在方法入参上无法单独提供嵌套验证功能...能配合嵌套验证注解@Valid进行嵌套验证。...@Valid:作为标准JSR-303规范,还没有吸收分组的功能; @Valid:可以用在方法、方法参数、构造函数、方法参数和成员属性(字段)上; @Valid加在方法参数并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上...比如一个User对象,新增的时候不需要检验id(系统生成),修改的时候需要检验id属性,要想复用Class,就可以使用Hibernate Validator的分组。

    2.7K10

    10 个影响程序性能的Hibernate 错误,学会让你少走弯路

    FetchType定义了Hibernate何时初始化关联。...例如,当Hibernate加载Author实体,它也提取相关的Book实体。这需要对每个Author进行额外的查询,因此经常需要几十甚至数百个额外的查询。 ?...这种方法是非常低效的,因为Hibernate不管你是不是要使用关联都会这样做。最好改用FetchType.LAZY代替。它会延迟关系的初始化,直到在业务代码中使用它。...当Hibernate执行1个查询来选择n个实体,然后必须为每个实体执行一个额外的查询来初始化一个延迟的获取关联,就会发生这个问题。 ?...幸运的是,你可以使用JPQL、原生SQL或Criteria查询对JPA和Hibernate执行相同的操作。 但是它有一些你应该知道的副作用。在数据库中执行更新或删除操作,将不使用实体

    2K50

    Hibernate映射继承关系

    Hibernate中,继承关系的映射可以使用三种方式,分别是单表继承、多表继承和一对一继承。...在Hibernate中,继承关系是指一个实体类继承自另一个实体类。...子类和父类有共同的属性,而子类定义的新属性,则沿用父类的属性,使用null来填充该属性。在映射到数据库使用表中的一个自增长id来区分子类和父类实体。...一对一继承一对一继承是指每个实体类映射到一个表中,同时每个表之间具有一对一的关系映射。在这种情形中,父子之间并不会共享某些字段,因此,嵌套不是必须的。...二、单表继承映射示例在本文中,我们将从单表继承开始,展示如何使用Hibernate实现继承关系的映射。下面是两个Java类,我们将使用这两个类来演示单表继承的映射。

    52130

    SpringBoot系列之数据库初始化-jpa配置方式

    上一篇博文介绍如何使用spring.datasource来实现项目启动之后的数据库初始化,本文作为数据库初始化的第二篇,将主要介绍一下,如何使用spring.jpa的配置方式来实现相同的效果 <!...: ddl-auto: update # 取值create/create-drop,会根据Entity生成表之后,再使用import.sql文件导入初始化数据; 为update,则执行的是...jpa的配置方式,将ddl-auto设置为create或者create-drop,会自动搜索@Entity实体对象,并创建为对应的表 II....小结 使用Jpa的配置方式,总体来说和前面的介绍的spring.datasource的配置方式差别不大,jpa方式主要是基于@Entity来创建对应的表结构,且不会出现再次启动之后重复建表导致异常的问题...spring.jpa.hibernate.ddl-auto: create/create-drop 这两个取值,再创建表之后执行import.sql文件导入测试数据;若取值为update,则会执行data.sql

    1.1K10

    码云推荐 | Java 持久层工具 jSqlBox

    jSqlBox 虽然最初目的是给 Hibernate 加一个动态配置,但考虑到实体容器开发及使用的复杂性,以及个人水平有限,借鉴了 MyBatis 的做法,即在运行期如需用到 OR 映射,在程序中动态配置并完成...可配置,当数据库表名、字段名与缺省匹配规则不一致,可用配置的方式来解决,配置为同目录或内嵌的"类名+Box"的 Java 类,也可将配置写在类初始化块中。...与 Hibernate 的区别在于 jSqlBox 一级缓存比较简单,只缓存实体,包括已修改过的,不缓存 SQL命令。...不使用代理类,不会有代理类造成的希奇古怪的问题。...实体映射比较简单,只限于将数据集内容装配成对象树,不支持多重嵌套映射和懒加载,需要懒加载的场合须由用户自行在程序中手工实现。或利用 jSqlBox 的无绑定关联来从根本上避免懒加载需求的出现。

    2K70

    何时使用Entity或DTO

    当我在我的在线培训或研讨会上讨论 Hibernate性能,我经常被问到,选择使用适当的映射是否是重要的? 答案是:是的!为你的用例选择正确的映射会对性能产生巨大影响。我只选择你需要的数据。...这很耗时,当你只想向客户端发送少量信息,这完全没有必要。 你还需要记住, Hibernate和任何其他 JPA实现都将所有托管实体存储在一级缓存中。这似乎是一件好事。...使用 Entity会产生开销,而你可以在使用 DTO避免这种开销。但这是否意味着不应该使用 Entity?显然不是。...默认情况下, To-one关联的 FetchtType是 EAGER,它告诉 Hibernate立即初始化关联。 这需要额外的查询,如果你的查询选择多个实体,则会产生巨大的性能影响。...因此,最好使用 FetchType.LAZY并初始化你的用例所需的关系。

    1.9K20

    Hibernate二级缓存提升性能(注解方式)

    ),hibernate二级缓存多应用在多读少写的实体对象中,比如组织机构和系统字典。...> 这样就引入了hibernate-ehcache-3.6.9.jar及其依赖包ehcache-core-2.4.3.jar 4、注解方式配置实体 配置了二级缓存后,并不是对所有的实体使用...二级缓存性能对比 在人员信息列表,性别、政治面貌、职称、职位使用字典对象存储,使用缓存后,第一次将相应字典缓存,之后在交互将不会重新查询数据库,从而提升系统性能。...测试场景:初始化字典下拉框,下拉框有24个值。 实验结果很明显,应用缓存的效果明显好于前两者,但是应用缓存在第一次的时候耗时较长,因为要做初始化操作。...在更新数据,要更新缓存,也会存在一定耗时,所以看到应用缓存的第一个点很高。

    69220
    领券