hibernate 一对多 查询怎么去掉重复数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate 一对多 查询怎么去掉重复数据相关的知识,希望对你有一定的参考价值。

参考技术A 加个distinct就可去重了,如下:
select B.A distinct from B where B.name='xx' and B.A.dept='pp'

hibernate学习——一对多关系表达

一对多实现

1、 实现类

package com.alice.hibernate02.vo;

import java.util.HashSet;
import java.util.Set;

public class Customer {
    private Integer id;
    private String name;
    // 一对多:一个客户(当前客户) 拥有 【多个订单】
    // * 需要容器存放多个值,一般建议Set (不重复、无序)
    // * 参考集合:List、Map、Array等
    // ** 建议实例化--使用方便

    private Set<Order> orders = new HashSet<Order>();

public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Order> getOrders() { return orders; } public void setOrders(Set<Order> orders) { this.orders = orders; } }
package com.alice.hibernate02.vo;

public class Order {
    private Integer id;
    private String name;
  //多对一:多个订单属于【一个客户】
    private Customer customer;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Customer getCustomer() {
		return customer;
	}
	public void setCustomer(Customer customer) {
		this.customer = customer;
	}
}

  2、 配置文件

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.alice.hibernate02.vo">
     <class name="Customer" table="t_customer">
        <id name="id" column="id">
           <generator class="native"></generator>
        </id>
        <property name="name" column="name" type="string"></property>
        <!-- 表达一对多关系中的集合
             name:集合的属性名称
             inverse: 是否将关系的维护反转给对方. 默认值: false
                    true: 在Customer 中 放弃维护外键关系
                    
             cascade :级联操作
                 save-update:级联保存,级联修改. 保存A时,同时保存B. 
                delete:删除A,同时删除B,AB都不存在
                delete-orphan:孤儿删除,解除关系,同时将B删除,A存在的。
                如果需要配置多项,使用逗号分隔。<set cascade="save-update,delete">
                
                all : save-update 和 delete 整合
                all-delete-orphan : 三个整合
                 
          -->
        <set name="orders">
        <!--
                 key 用来描述外键
                 column : 外键的值
               -->
          <key column="cid"></key>
          <one-to-many class="Order"/>
        </set>
     </class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.alice.hibernate02.vo">
     <class name="Order" table="t_order">
        <id name="id" column="id">
           <generator class="native"></generator>
        </id>
        <property name="name" column="name" type="string"></property>
        <!-- 表达一对多关系中的集合
             name:集合的属性名称
             inverse: 是否将关系的维护反转给对方. 默认值: false
                    true: 在Customer 中 放弃维护外键关系
                    
             cascade :级联操作
                 save-update:级联保存,级联修改. 保存A时,同时保存B. 
                delete:删除A,同时删除B,AB都不存在
                delete-orphan:孤儿删除,解除关系,同时将B删除,A存在的。
                如果需要配置多项,使用逗号分隔。<set cascade="save-update,delete">
                
                all : save-update 和 delete 整合
                all-delete-orphan : 三个整合
                 
          -->
        <!-- 表达多对一关系 
             name: 引用的属性名称
             column: 外键的列名
             class: 我引用的Order的完整类名
         -->
         <many-to-one name="customer" column="cid" class="Customer"></many-to-one>
     </class>
</hibernate-mapping>

3、一对多操作

 1 public void test01() {
 2         Session session = HibernateUtil.openSession();
 3         Transaction tran = session.beginTransaction();
 4 
 5         Customer cus = new Customer();
 6         cus.setName("alice");
 7 
 8         Order o1 = new Order();
 9         o1.setName("apple");
10 
11         Order o2 = new Order();
12         o2.setName("banana");
13 
14         cus.getOrders().add(o1);// 维护关系
15         cus.getOrders().add(o2);// 维护关系
16 
17         o1.setCustomer(cus);
18         o2.setCustomer(cus);
19 
20         session.save(cus);//保存对象
21         session.save(o1);//保存对象
22         session.save(o2);//保存对象
23 
24         tran.commit();
25 
26         session.close();
27 
28     }

4、   级联操作(读、理解)

save-update:A保存,同时保存B

delete:删除A,同时删除B,AB都不存在

delete-orphan:孤儿删除,解除关系,同时将B删除,A存在的。

如果需要配置多项,使用逗号分隔。<set cascade="save-update,delete">

 

all : save-update 和 delete 整合

all-delete-orphan : 三个整合

package com.alice.hibernate02.many;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.alice.hibernate02.util.HibernateUtil;
import com.alice.hibernate02.vo.Customer;
import com.alice.hibernate02.vo.Order;

//测试 一对多关系
public class ManyTest02 {
  
    @Test
    ////我们希望在保存Customer时,自动将未保存的Orders当中的Order保存
    //cascade: save-update
    public void test01() {
        Session session = HibernateUtil.openSession();
        Transaction tran = session.beginTransaction();

        Customer cus = new Customer();
        cus.setName("alice");

        Order o1 = new Order();
        o1.setName("apple");

        Order o2 = new Order();
        o2.setName("banana");

        cus.getOrders().add(o1);// 维护关系
        cus.getOrders().add(o2);// 维护关系

//        o1.setCustomer(cus);
//        o2.setCustomer(cus);

        session.save(cus);//保存对象
//        session.save(o1);//保存对象
//        session.save(o2);//保存对象

        tran.commit();

        session.close();

    }
    @Test
     ////我们希望在保存Customer时,自动将未保存的Orders当中的Order保存
      //cascade: save-update
    public void test02() {
        Session session = HibernateUtil.openSession();
        Transaction tran = session.beginTransaction();

        Customer cus = (Customer) session.get(Customer.class, 2);//1条 select
        
        for(Order o :cus.getOrders()){// 1条 select
            o.setName("mike");// 修改订单
        }
        
        tran.commit();//因为设置级联修改,自动将订单的修改保存到数据

        session.close();

    }
  //cascade: delete
      //删除Customer时 ,会将Customer下的订单一并删除
      //inverse : false   6条sql语句   
      //inverse : true    5条sql语句 比上面少一条维护外键
    @Test
    public void test03() {
        Session session = HibernateUtil.openSession();
        Transaction tran = session.beginTransaction();

        Customer cus = (Customer) session.get(Customer.class, 3);//1条 select
        
        session.delete(cus);//删除Customer
         // 删除两个Order
        
        tran.commit();//因为设置级联修改,自动将订单的修改保存到数据

        session.close();

    }
  //cascade: delete
      //操作的两方cascade值都为delete
      //需要注意: 千万不要在两方都配置 级联删除. 删除任何一方,会导致整个关系链对象全部删除.
    @Test
    public void test04() {
        Session session = HibernateUtil.openSession();
        Transaction tran = session.beginTransaction();

        Order o =(Order) session.get(Order.class, 6);
        
        session.delete(o);//删除Customer
         // 删除两个Order
        
        tran.commit();//因为设置级联修改,自动将订单的修改保存到数据

        session.close();

    }
    
}
package com.alice.hibernate02.many;

import java.util.Iterator;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.alice.hibernate02.util.HibernateUtil;
import com.alice.hibernate02.vo.Customer;
import com.alice.hibernate02.vo.Order;

//测试 一对多关系
public class ManyTest03 {
    @Test
    //inverse:false
        //cascade: delete-orphan 孤儿删除 => 当没有任何外键引用Order时,order 会被删除
    public void test02(){
        Session session = HibernateUtil.openSession();
        Transaction tran = session.beginTransaction();
        
        Customer cus = (Customer) session.get(Customer.class, 4);
        Iterator<Order> iter = cus.getOrders().iterator();
        //注意: 删除Customer下的订单时,不能使用 c.setOrders(null); c.setOrders(new HashSet());
        while(iter.hasNext()){// 遍历Customer下的订单,并将订单删除 => 维护关系
            iter.next();
            iter.remove();
        }
        //cascade: all-delete-orphan => 相当于配置 save-update,delete,delete-orphan


    }
    //cascade: all-delete-orphan => 相当于配置 save-update,delete,delete-orphan
    @Test
    public void fun1(){
        Session session = HibernateUtil.openSession();
        Transaction tran = session.beginTransaction();
        //------------------------------------------------
        Customer c = new Customer();
        c.setName("tom");
        
        Order o1 = new Order();
        o1.setName("肥皂");
        
        Order o2 = new Order();
        o2.setName("蜡烛");
        
        c.getOrders().add(o1);//维护关系
        c.getOrders().add(o2); //维护关系
        
        session.save(c);
        //------------------------------------------------
            session.getTransaction().commit();
            session.close(); // 游离状态
    }
}

 


以上是关于hibernate 一对多 查询怎么去掉重复数据的主要内容,如果未能解决你的问题,请参考以下文章

hibernate一对多关系 在一方查询会获得重复数据,重复数量就是多端数据数量用@Fetch(FetchMode.SUBSELECT)解决

hibernate 一对多双向关联 外键值为空 怎么结决?

hibernate 一对多 查询问题

hibernate 一对多update操作的hql语句怎么写?

hibernate配置双向一对多的时候,困惑了

Hibernate中left join fetch 查询出现重复的对象