use*_*472 5 java hibernate criteria
我有实体
@Entity
@Table(name = "CRM_LOG")
public class CrmLog implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private @Getter @Setter Long id;
..........
@OneToOne
private @Getter @Setter CrmUser crmUser;
}
Run Code Online (Sandbox Code Playgroud)
和另一个实体
@Entity
@Table(name = "CRMUSER")
public class CrmUser implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Integer groupId;
public Integer getGroupId() {
return groupId;
}
public void setGroupId(Integer groupId) {
this.groupId = groupId;
}
}
Run Code Online (Sandbox Code Playgroud)
我做了休眠标准选择
criteria.add(Restrictions.in("crmUser.id", selectedIds));
Run Code Online (Sandbox Code Playgroud)
它工作正常.但这个标准失败了
criteria.add(Restrictions.in("crmUser.groupId", filterGroupIds));
Run Code Online (Sandbox Code Playgroud)
我收到一个错误
org.hibernate.QueryException: could not resolve property: crmUser.groupId of: crm.entity.CrmLog
Run Code Online (Sandbox Code Playgroud)
这段代码
criteria.add(Restrictions.in("crmUser.id", selectedIds));
Run Code Online (Sandbox Code Playgroud)
之所以有效,是因为CrmLog表具有CrmUser id外键列。所以Hibernate不需要在SQL查询中添加连接。
要添加对其他CrmUser属性的限制,您需要添加别名。这样的别名告诉 Hibernate 将连接添加到 SQL 请求。
criteria.createAlias("crmUser", "user");
criteria.add(Restrictions.in("user.groupId", filterGroupIds));
Run Code Online (Sandbox Code Playgroud)
默认情况下,Hibernate 添加一个内连接。对于左连接
criteria.createAlias("crmUser", "user", JoinType.LEFT_OUTER_JOIN);
criteria.add(Restrictions.in("user.groupId", filterGroupIds));
Run Code Online (Sandbox Code Playgroud)
JoinType.LEFT_OUTER_JOIN可以与 Hibernate 5(也许是 Hibernate 4)一起使用
您可以为根实体分配别名。也许这样的例子更清楚
Criteria criteria = session.createCriteria(CrmLog.class, "log");
criteria.createAlias("log.crmUser", "user");
criteria.add(Restrictions.in("user.groupId", filterGroupIds));
Run Code Online (Sandbox Code Playgroud)