即使FetchMode = Join,Hibernate也会发出select语句

Man*_*gal 28 hibernate

我有一个用国家实体映射的userAccount实体.UserAccount类中的国家/地区映射是这样的

@ManyToOne(fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name="f_country_id", nullable=true, insertable=false, updatable=false)
private Country country;
Run Code Online (Sandbox Code Playgroud)

即使将fetchmode定义为Join,hibernate也会触发单独的SQL Select以获取国家/地区.

Sat*_*was 17

删除fetch=FetchType.EAGER.Eager fetching触发级联select语句.

  • 如果您使用显式HQL查询,例如"from User where something = someValue",Hibernate将不会遵循带注释的Fetch模式.您需要在HQL查询中指定连接或在条件中指定提取模式. (22认同)
  • 不是FetchType.EAGER是ManyToOne的默认值吗?我认为@SatadruBis所提到的显式where子句可能是问题所在. (6认同)
  • 为什么接受这个答案?它以哪种方式解决OP问题?正如@JamesSelvakumar所说,`FetchType.EAGER`是注释的默认值,因此删除它不会改变任何东西. (4认同)
  • 我需要热切期待.有什么方法可以加入渴望加入...? (3认同)
  • 没有解决问题.它仍然将select语句触发到数据库.我使用以下内容:@ManyToOne @Fetch(FetchMode.JOIN)@JoinColumn(name ="f_country_id",nullable = true,insertable = false,updatable = false)private country country; (3认同)

sol*_*ola 10

Satadru Biswas在之前的评论中给出了答案.

当您使用Query接口(Session.createQuery)时,Hibernate 3.x会忽略FetchMode注释,因此在这种情况下,您必须将INNER JOIN FETCH子句添加到查询的FROM部分.

然而,标准界面将正确使用此界面.


小智 6

我尝试在所有api(JPQL和CriteriaBuilder)中使用@Fetch(FetchMode.JOIN)hibernate注释,但是没有用.只有服务类中的代码可以正常工作:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<UserAccount > cq = cb.createQuery(UserAccount.class);
Root<UserAccount> o = cq.from(UserAccount.class);

o.fetch("country",JoinType.INNER);

em.createQuery(cq.select(o)).getResultList();
Run Code Online (Sandbox Code Playgroud)