假定Customer类和Order类之间为双向一对多关联关系.
Customer类包含的属性:
/**对象OID*/ private Long id; /**Customer对象的姓名*/ private String name; /**Customer对象的年龄*/ private int age; /**与Customer对象的订单*/ private Set<Order> orders=new HashSet<Order>();
<class name="Customer" table="customers"> <id name="id" type="long" column="id"> <generator class="native" /> </id> <property name="name" type="string" column="name" /> <property name="age" type="int" column="age" /> <set name="orders" cascade="all" inverse="true" lazy="true"> <key column="customer_id" /> <one-to-many class="Order" /> </set> </class>
/**对象OID*/ private Long id; /**Order 对象的订单号*/ private String orderNumber; /**Order 对象的订单价格*/ private double price; /**与Order 对象关联的Customer对象*/ private Customer customer;
<class name="Order" table="orders"> <id name="id" type="long" column="id"> <generator class="native"/> </id> <property name="orderNumber" type="string" column="orderNumber" length="15" /> <property name="price" type="double" column="price" /> <many-to-one name="customer" column="customer_id" class="Customer" /> </class>
cusomters表
orders表:
以下为测试代码:
List result=session.createQuery("select c from Customer as c inner join c.orders where c.name like 'T%'") .list(); Iterator it = result.iterator(); Customer customer=(Customer) it.next(); System.out.println(customer.getOrders().size());
Hibernate: select customer0_.id as id4_, customer0_.name as name4_, customer0_.age as age4_ from customers customer0_ inner join orders orders1_ on customer0_.id=orders1_.customer_id where customer0_.name like 'T%' Hibernate: select orders0_.customer_id as customer4_4_1_,//重复字段 orders0_.id as id1_,//重复字段 orders0_.id as id5_0_, orders0_.orderNumber as orderNum2_5_0_, orders0_.price as price5_0_, orders0_.customer_id as customer4_5_0_ from orders orders0_ where orders0_.customer_id=?
上述sql语句中,注释重复字段与下面的字段重复了,为什么要重复检索orders的主键id和外键customer_id字段
另:
上述采用内链接方式检索,但其实做外连接,迫切做外连接,单表查询也会重复检索主键和外键字段