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

org.hibernate.QueryException: could not resolve property but another property is found

我有实体

@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;
}

和另一个实体

@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;
    }
}

我制定了休眠标准select

criteria.add(Restrictions.in("crmUser.id", selectedIds));

而且效果很好。但这个条件不合格

criteria.add(Restrictions.in("crmUser.groupId", filterGroupIds));

我收到一个错误

org.hibernate.QueryException: could not resolve property: crmUser.groupId of: crm.entity.CrmLog

此代码

criteria.add(Restrictions.in("crmUser.id", selectedIds));

之所以有效,是因为 CrmLog table 具有 CrmUser id 作为外键列。所以 Hibernate 不需要在 SQL 查询中添加连接。

要对其他 CrmUser 属性添加限制,您需要添加别名。这样的别名告诉 Hibernate 添加连接到 SQL 请求。

criteria.createAlias("crmUser", "user");
criteria.add(Restrictions.in("user.groupId", filterGroupIds));

默认情况下,Hibernate 添加了一个内连接。对于左连接

criteria.createAlias("crmUser", "user", JoinType.LEFT_OUTER_JOIN);
criteria.add(Restrictions.in("user.groupId", filterGroupIds));

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));