org.hibernate.QueryException:无法解析属性,但找到另一个属性

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)

v.l*_*nev 4

这段代码

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)