我对使用Criteria的加入时有点困惑。我正在谈论的例子:
.createAlias("cars", "c", JoinType.LEFT_OUTER_JOIN)
以下是不同的JoinType:
LEFT_OUTER_JOIN
INNER_JOIN
LEFT_OUTER_JOIN
NONE
RIGHT_OUTER_JOIN
当我们使用Hibernate映射实体时,已经存在" JoinType"自动(是一个INNER_JOIN?)。
用户的简单例子 - 汽车:
用户类(表名USERS)
class User {
@Id
@Column(name="ID_USER")
private int idUser;
@Column(name="NAME")
private String name;
@OneToMany
@JoinColumn(name="ID_USER")
private Set<Car> cars;
}
和Car类(表名CARS):
class Car{
@Id
@Column(name="ID_CAR")
private int idCar;
@Column(name="MODEL)
private String model;
@Column(name="ID_USER")
private int idUser;
}
如果我有一个用户u,我输入u.getCars(),默认情况下是否映射了Join?
如果我想要例如:
的结果SELECT * FROM Users u LEFT JOIN Cars c on u.id_user = c.id_user
然后使用它是正确的:
Criteria c = getSession().createCriteria(User.class);
c.createAlias("cars", "c", JoinType.LEFT_OUTER_JOIN);
return c.list();
(然后我循环用户和汽车搜索我正在寻找的东西)。
如果我正在寻找:
SELECT * FROM Users u INNER JOIN Cars c on u.id_user = c.id_user
我说得对,我不需要创建JoinType.INNER_JOIN吗? 如果我是,当我已经有地图邀请时,JoinType.INNER_JOIN是无用的吗?
我必须使用大量的连接映射很多复杂的表格,我有点混乱!
答案 0 :(得分:0)
当我们使用Hibernate映射实体时,自动已经有一个“JoinType”(是INNER_JOIN吗?)。
假设您已将oneToMany
关联标记为Fetch.EAGER
。在这种情况下,当您通过User
加载hibernate criteria
对象时,默认情况下会使用LEFT OUTER JOIN
,除非您在Criteria
中覆盖它。如果您没有将其标记为FetchType.EAGER
,则它将是惰性的,因此默认情况下不会再次加入,除非您在Criteria
中覆盖它。
如果我有一个用户u,我输入u.getCars(),默认情况下是否映射了Join?
对于EAGER加载,请参阅上文。如果懒惰并且它在同一个会话中,您正在调用u.getCars
,它将触发一个新的SELECT以根据userId
加载汽车,因此不会加入。
我说得对,我不需要创建JoinType.INNER_JOIN吗?如果我是,JoinType.INNER_JOIN在我已经有地图实体时没用了吗?
请参阅上文,默认情况下,如果是EAGER则为LEFT OUTER JOIN,除非在Criteria
中覆盖。
关于建议, - 最好通过enable show_sql property
使用不同的FetchTypes
和Criteria JOIN Types
来查看hibernate在后台实际触发的SQL,因为基于你的entiy映射SQL查询的计数/复杂性可能不同。