Java 使用组合键的错误条件.list
实体 //主键 查询正常:如果实例pk setterJava 使用组合键的错误条件.list,java,hibernate,criteria,Java,Hibernate,Criteria,实体 //主键 查询正常:如果实例pk setter @Embeddable public class PK implements Serializable { private static final long serialVersionUID = -5441836698300495848L; @javax.persistence.Column(name = "id_titulo") private Long titulo_id; @javax.persis
@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
}
查询错误
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();
控制台中出错:*无法解析属性:id\u empresa of:Entidade*
只需按公司搜索,如果使用约束,则返回上述错误。在
标准中,如您所知,必须使用类成员的名称,而不是数据库中字段的名称。但是@AttributeOverride
注释并没有在PK
类中重写此属性,而只是在Entidade
类中重写。因此,必须使用在PK
类中声明的属性名称,即id.empresa\u id
因此,您的代码应该是:
Criteria criteria = novoCriteria();
criteria.createAlias("id", "id");
criteria.add(Restrictions.eq("id.id_empresa", 2L));
criteria.list();
在我的一个项目中,我可以重现您的错误,并可以使用可嵌入类中参数的名称来解决它。我认为它也应该适用于您。似乎id\u empresa
是列名。您需要将其替换为类Entidade
->id.javaField
(可能是id.pk
,但我不知道EmbeddedId
有什么作用)将pk
类添加到您的问题中,以便我们可以检查您是否使用了正确的语法来添加限制。我首先犯了一个错误,因为我没有看到@AttributeOverride
,所以我决定删除我的答案。但是现在,我认为这个解决方案是正确的。告诉我你是否能用这个技巧解决你的问题。
Criteria criteria = novoCriteria();
criteria.createAlias("id", "id");
criteria.add(Restrictions.eq("id.id_empresa", 2L));
criteria.list();
Criteria criteria = novoCriteria();
criteria.createAlias("id", "id");
criteria.add(Restrictions.eq("id.empresa_id", 2L));
criteria.list();