`
Tin
  • 浏览: 138615 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate中获取关联属性为null的方式

阅读更多
在Hibernate中获取有关联关系的pojo。我是指例如一个User(用户)拥有一个many-to-one的属性Unit(单位),但是有时有些用户的Unit属性为空,如果按单位查询用户的时候那些单位为null的用户就会被遗漏,如何调取呢?这本来是很简单的,但是我想当然的使用了Restriction.eq,但是不行,后来看了手册才发现应该使用Restrictions.isNul。下面是Test代码...

    /** *//**
     * 为了获取一个unit为null的用户,如果传入一个null作为Uint实例则返回的结果总是0
     * 因为执行的SQL为:(select * ) from USER_INF this_ where this_.UNIT_ID=''
     * 这不是我们所期望的结果
     
*/

    @Test
    
public void getUsersWhosUnitIsNullByRestrictionsEqNullUnit() {
        DetachedCriteria dc 
= DetachedCriteria.forClass(User.class);
        dc.add(Restrictions.eq(
"unit"null));

        Criteria cri 
= dc.getExecutableCriteria(session);
        log.debug(
"getUsersWhosUnitIsNullByRestrictionsEqNullUnit():" + cri.list().size());
    }

    
    
/** *//**
     * 为了获取一个unit为null的用户,如果传入一个id为null的Unit实例则会报错,无法翻译为SQL
     * 错误类型为:org.hibernate.TransientObjectException
     * 这也不是我们所期望的结果
     
*/

    @Ignore
    @Test(expected
=TransientObjectException.class)
    
public void getUsersWhosUnitIsNullByRestrictionsEqUnitNullId() {
        Unit unit 
= new Unit();
        log.debug(unit.getId());
        DetachedCriteria dc 
= DetachedCriteria.forClass(User.class);
        dc.add(Restrictions.eq(
"unit", unit));

        Criteria cri 
= dc.getExecutableCriteria(session);
        log.debug(
"getUsersWhosUnitIsNull():" + cri.list().size());
    }


    
/** *//**
     * 为了获取一个unit为null的用户正确的方法应该是使用Restrictions.isNull方法
     * 因为执行的SQL为:(select * ) from USER_INF this_ where this_.UNIT_ID is null
     * 这才是我们所希望的结果
     
*/

    @Test
    
public void getUsersWhosUnitIsNullByRestrictionsIsNull() {
        DetachedCriteria dc 
= DetachedCriteria.forClass(User.class);
        dc.add(Restrictions.isNull(
"unit"));

        Criteria cri 
= dc.getExecutableCriteria(session);
        log.debug(
"getUsersWhosUnitIsNullByRestrictionsIsNull():" + cri.list().size());
    }
分享到:
评论

相关推荐

    Hibernate关联映射-one to one单向外键关联

    本话题主要探讨的是Hibernate中的一种关联映射方式——一对一(One-to-One)单向外键关联。这种关联模式通常用于两个实体之间存在唯一对应的关系,例如一个用户对应一个唯一的账户。 在Hibernate中,一对一关联可以...

    全面解读hibernate关联关系

    总结,hibernate的一对多和多对一关联关系是通过在实体类中定义属性并配置相应的数据库外键实现的。理解并正确使用这些关联关系,能够帮助我们在设计和实现复杂的数据模型时更加得心应手。在实际开发中,应根据项目...

    Hibernate中Example的用法

    在上述示例中,我们首先创建了一个`Student`实例并设置了其`studentNumber`属性,然后使用`Example.create()`方法创建了`Example`对象,并调用`excludeNullValues()`方法来排除所有未设置(即值为`null`)的属性参与...

    hibernate双向一对多关联映射(XML)

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系数据库模型与对象模型之间的映射方式。这种映射允许在一个实体类中存在多个另一个实体类的实例,而在另一个实体类中也可能存在对第一个实体类的...

    hibernate实现多对一得单项关联

    2. 非空约束:在多对一关联中,通常关联的一方(如`Teacher`)不允许为null,可以通过`not-null`属性进行配置。 3. 负载优化:为了提高性能,可以使用`fetch`属性来控制关联对象的加载策略,如懒加载(lazy)或立即...

    hibernate 中文注解

    - **无注解之属性的默认值:** 如果没有显式使用注解,Hibernate会默认将类的属性映射到表中的列。 - **映射主键属性:** 主键映射通过`@Id`注解实现。 - **映射继承关系:** - **每个类一张表:** 每个子类对应...

    hibernate annotation 中文文档

    - **4.1.2 内建约束**:Hibernate 验证器内置了一些常见的约束注解,如 `@NotNull`、`@Size` 等。 - **4.1.3 错误信息**:可以通过 `@Constraint` 注解的 `message` 属性来定义约束违反时的错误消息。 - **4.1.4 ...

    Hibernate DOC 中文文档

    4. **检索(Load/Get)**:load()基于主键获取对象,get()也是根据主键但不抛出异常,如果对象不存在则返回null。 5. **查询(Query)**:使用HQL或Criteria API执行复杂的查询操作。 **七、级联操作** 在映射配置...

    Hibernate 中文api文档

    在Hibernate中,数据库表被映射为Java类,表中的行对应于类的实例,列则对应于类的属性。这使得开发人员可以使用面向对象的方式来处理数据库操作,而无需编写大量的SQL语句。 **主要组件** 1. **Configuration**:...

    hibernate 关联映射(一) many to one

    这里,`name`属性对应实体类中的属性名,`class`属性指定了关联实体的全限定类名,`fetch`属性可以设置为“join”以启用级联加载,而`column`元素则定义了外键列。 在实际应用中,我们还需要处理懒加载和级联操作。...

    hibernate如何实现一对多的关联源代码

    总之,Hibernate的一对多关联是Java EE开发中常见的数据关系,理解并熟练运用这一特性有助于构建高效的数据访问层。希望上述内容对初学者在学习Hibernate和Java EE开发过程中有所帮助,继续努力学习,不断提升自己的...

    hibernate_day02笔记

    3. 可以通过验证查询操作来证明一级缓存的存在,连续两次相同查询不会触发数据库查询,而是从缓存中获取结果。 **Hibernate事务操作**: 1. 事务是一系列数据库操作的集合,具有ACID特性(原子性、一致性、隔离性、...

    hibernate入门与概述

    - **基本数据类型和包装类型**:推荐使用包装类型(如Integer而非int),因为它们的默认值为null,能更好地表示数据库中的空值。 - **访问策略**:`access`属性可以设置为`property`或`field`,控制Hibernate如何...

    hibernate教程

    实体Bean是Hibernate中非常重要的概念之一,用于表示数据库中的表,并通过注解来映射其字段与数据库表中的列。 ##### 3.1 简介 实体Bean是表示数据库表的对象形式,在Hibernate中通过注解进行配置,可以实现对象与...

    hibernate 三种 查询 方式 load与get的区别

    本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...

    hibernate延迟加载解决

    具体来说,Hibernate会生成并执行一条SQL语句来获取所有与User关联的Address对象,并将它们填充到一个自定义的集合对象中。这里需要注意的是,Hibernate提供的自定义集合类(如`net.sf.hibernate.collection.Set`)...

    (4)Hibernate中的many-to-one和one-to-many关系

    此注解通常用在引用表的外键字段上,并可以通过`fetch`属性控制加载策略(默认为懒加载),`optional`属性表示是否允许为null(默认为true)。 2. one-to-many关系 相反,one-to-many关系表示在一个实体类中,一个...

    Hibernate练习题

    - 如果希望Hibernate级联保存集合中的对象,cascade属性应设为'save-update',以便在保存主对象时自动保存集合中的对象。 11. Hibernate检索方式: - 有四种主要检索方式:HQL(Hibernate查询语言)、Criteria ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     6.1.2 从序列(Sequence)中获取自动增长的标识符 6.2 Java语言按内存地址区分不同的对象 6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法  6.4.1 increment标识符生成器  ...

Global site tag (gtag.js) - Google Analytics