hibernate many to many查询

使用Hibernate HQL查询实现多对多关系中查询关联角色
本文介绍了如何使用Hibernate HQL查询实现多对多关系中查询与用户关联的角色,通过给出具体SQL语句,详细解释了查询过程。

 原文地址:http://topic.youkuaiyun.com/u/20100524/11/07083ba1-ddeb-44ce-985e-c8991e3c7b6a.html

 

三个table
1. User
 
2. Role
 
3. User_Role
 
Role对象里面有个many-to-many的关系 Set <User>
 
需求:查询所有 传进来一个 user 然后查出 与他关联的 List<Role>
hibernate hql 查询如何实现?

 

4楼:

select a from User_Role a left join a.User b where b.user_id=userId
 
7楼:
select * from Role where (from User where id=" + value + ") in elements(users)
 
 

 

 

Hibernate 中,`many-to-one` 关系用于表示数据库中两个实体之间的多对一关联。例如,多个订单(Order)可以属于一个客户(Customer)。在这种情况下,`Order` 类将包含一个指向 `Customer` 的引用,而 `Customer` 类将包含一个 `Order` 的集合。这种关系是双向的,但在 Hibernate 中,通常建议只在关系的“所有者”一方维护这种关系。 ### Many-to-One 关系示例 假设我们有两个实体:`Customer` 和 `Order`。每个 `Order` 都关联到一个 `Customer`,而一个 `Customer` 可以有多个 `Order`。 #### 实体类定义 ```java // Customer.java public class Customer { private int id; private String name; private Set<Order> orders = new HashSet<>(); // Getters and Setters } // Order.java public class Order { private int id; private String details; private Customer customer; // Getters and Setters } ``` #### Hibernate 映射文件 在 Hibernate 的 XML 映射文件中,我们需要定义 `many-to-one` 关系。在这个例子中,`Order` 是关系的所有者,因为它包含了指向 `Customer` 的外键。 ```xml <!-- Customer.hbm.xml --> <hibernate-mapping> <class name="Customer" table="customer"> <id name="id" column="id"> <generator class="native"/> </id> <property name="name" column="name"/> <!-- 由于 Customer 是关系的反方,我们使用 inverse="true" --> <set name="orders" inverse="true"> <key column="customer_id"/> <one-to-many class="Order"/> </set> </class> </hibernate-mapping> <!-- Order.hbm.xml --> <hibernate-mapping> <class name="Order" table="order"> <id name="id" column="id"> <generator class="native"/> </id> <property name="details" column="details"/> <!-- many-to-one 关系定义 --> <many-to-one name="customer" class="Customer" column="customer_id" not-null="true"/> </class> </hibernate-mapping> ``` 在 `Customer` 的映射文件中,`<set>` 元素中的 `inverse="true"` 表示 `Customer` 不负责维护关系,而是由 `Order` 来维护。这意味着当我们保存 `Customer` 时,Hibernate 不会自动更新 `Order` 表中的外键。 ### 使用示例 当创建一个新的 `Order` 并将其关联到一个 `Customer` 时,代码可能如下所示: ```java Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); Customer customer = new Customer(); customer.setName("John Doe"); Order order = new Order(); order.setDetails("Order Details"); order.setCustomer(customer); // 设置关系 session.save(customer); session.save(order); tx.commit(); session.close(); ``` 在这个例子中,`Order` 对象通过 `setCustomer` 方法与 `Customer` 建立了关联。由于 `Order` 是关系的所有者,因此保存 `Order` 时,Hibernate 会正确地更新外键。 ### 总结 在 Hibernate 中,`many-to-one` 关系是通过在实体类中添加对另一个实体的引用,并在映射文件中使用 `<many-to-one>` 元素来定义的。为了确保数据的一致性和避免重复的更新操作,应该明确指定哪一方是关系的所有者。通常情况下,拥有外键的那一方应该是关系的所有者。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值