在Criteria中使用JoinType时? Hibernate映射

时间:2018-03-29 12:38:27

标签: java hibernate join criteria

我对使用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是无用的吗?

我必须使用大量的连接映射很多复杂的表格,我有点混乱!

1 个答案:

答案 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使用不同的FetchTypesCriteria JOIN Types来查看hibernate在后台实际触发的SQL,因为基于你的entiy映射SQL查询的计数/复杂性可能不同。