Hibernate Criteria API与关联的确切用法

时间:2013-09-08 08:39:02

标签: hibernate jpa hibernate-criteria

我有两张桌子:1.Customer_Table 2.Order_Table。 表之间存在一对多映射,其中一个客户可以有多个订单.Customer_id是Customer表的主键和Order表的外键。 我的Customer.hbm.xml文件的片段:

enter code here

    <set name="orders">
        <key column="Customer_id" /><!-- Customer_id acts as foreign key for Order table -->
        <one-to-many   class="Order" />
    </set>

.... 我在Retreive.java文件中编写以下代码段以获取以下客户的订单: 1.客户名称应以Rahul开头 2.客户订单描述应为'电子'类型

Criteria criteria1 = session.createCriteria(Customer.class).
        add(Restrictions.like("customerName", "Rahul%"));`
Criteria criteria = criteria1.createCriteria("orders").add(Restrictions.like("orderDescription", "electronics%"));
List list = criteria.list();

根据我的理解,Hibernate将在两个表上执行内连接并返回符合上述两个条件的列表。

在此之后,我的要求是从结果集中获取orderDescriptions(在这种情况下为List)。

为了达到这个目的,我需要编写什么java代码?

3 个答案:

答案 0 :(得分:1)

终于能够解决我关于获得一组受限制的关联而不是整个关联的问题。 希望以下代码片段有所帮助。

Criteria criteria1 = session.createCriteria(Customer.class).
    add(Restrictions.like("customerName", "Rahul%"));`
Criteria criteria = criteria1.createCriteria("orders","order").add(Restrictions.like("orderDescription","electronics%")).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);//order is alias to orders collection
List<Map> list = criteria.list();

使用setResultTransformer,我们得到一个Map列表,其中包含内部联接的结果,而不是更传统的客户列表。

for(Iterator itr = list.iterator();itr.hasNext();){
Map map = (Map)itr.next();
Customer student = (Customer) map.get(Criteria.ROOT_ALIAS);
Order order = (Order) map.get("order");//alias that was used earlier for orders
}

答案 1 :(得分:0)

您可以使用Iterator从List中获取数据。 这段代码将用于迭代您的列表数据。

Iterator it=list.iterator();
while(it.hasNext()) {
System.out.println(it.next());//Yout can write your own implemantation
}

答案 2 :(得分:0)

我建议将结果投射到List<Customer>,这样可以更轻松地访问Customer字段。

List<Customer> list = (List<Customer>)criteria.list();

然后遍历列表,通过访问器方法访问订单/描述:

   for(Customer customer: list){
       for(Order order: customer.getOrders()){
          order.getDescription(); //pseudo code since entities were not revealed
       }
   }

此答案假定Customer包含List<Order>Order实体包含description字段。