实体
@javax.persistence.Entity
@javax.persistence.Table(name = "entidade")
public class Entidade {
private static final long serialVersionUID = -6831078183847196839L;
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "id_titulo", column = @Column(name = "titulo_id", nullable = false)),
@AttributeOverride(name = "id_empresa", column = @Column(name = "empresa_id", nullable = false)) })
private PK pk;
//getter//setter
}
// PK
@Embeddable
public class PK implements Serializable {
private static final long serialVersionUID = -5441836698300495848L;
@javax.persistence.Column(name = "id_titulo")
private Long titulo_id;
@javax.persistence.Column(name = "id_empresa")
private Long empresa_id;
//getter // setter
}
查询没问题:如果是实例pk setter
Criteria criteria = novoCriteria();
criteria.createAlias("id", "id");
TituloPK pk = new TituloPK();
pk.setEmpresa(2L);
pk.setTitulo(6364L);
criteria.add(Restrictions.eq("id", pk));
criteria.list();
查询错误
Criteria criteria = novoCriteria();
criteria.createAlias("id", "id");
criteria.add(Restrictions.eq("id.id_empresa", 2L));
criteria.list();
控制台出错: *无法解析属性:id_empresa:Entidade *
只需按公司搜索,如果我使用约束,则返回上述错误。
答案 0 :(得分:0)
在Criteria
中,如您所知,您必须使用类成员的名称,而不是数据库中字段的名称。但是@AttributeOverride
注释不会覆盖PK
类中的此属性,而只会覆盖Entidade
类。因此,您必须使用在PK
类中声明的属性名称,即id.empresa_id
。
所以你的代码应该是:
Criteria criteria = novoCriteria();
criteria.createAlias("id", "id");
criteria.add(Restrictions.eq("id.empresa_id", 2L));
criteria.list();
在我的一个项目中,我可以重现您的错误,并可以使用embeddable类中的参数名称来解决它。我认为它也适合你。