Hibernate QueryException

时间:2014-06-18 09:21:13

标签: java sql hibernate criteria

您好我试图在Criteria中引用一个复合键的属性,该键在实体上定义为和@Embeddable

@Entity
@Table(name = "B_J_P")
public class BJP implements java.io.Serializable {

private BJPId id;
private BJI bJI;

public BJP() {
}

public BJP(BJPId id, BJI bJI) {
this.id = id;
this.bJI = bJI;
}

@EmbeddedId
@AttributeOverrides( {
    @AttributeOverride(name = "jIId", column = @Column(name = "J_I_ID", nullable = false)),
    @AttributeOverride(name = "kN", column = @Column(name = "K_N", nullable = false, length = 100)),

public BJPId getId() {
    return this.id;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "J_I_ID", nullable = false, insertable = false, updatable = false)
public BJI getBJI() {
    return this.bJI;
}
}

我需要从以下内容中获取kName:

@Embeddable
public class BJPId implements java.io.Serializable {


private long jIId;
private String kName;

public BJPId() {
}

public BJPId(long jIId, String kN) {
    this.jIId = jIId;
    this.kN = kN;
}

@Column(name = "J_I_ID", nullable = false)
public long getJIId() {
    return this.jIId;
}

@Column(name = "K_NAME", nullable = false, length = 100)
public String getKName() {
    return this.kName;
}
}

但是当我试图从基类到达它时,BJP是具有以下标准的属性

DetachedCriteria timestampFilter = DetachedCriteria.forClass(BJP.class)
            .createAlias("id","alias")
            .add(Restrictions.eq("alias.kName","DataSetName"))
            .setProjection(Projections.property("kName"));

我收到以下错误:

org.hibernate.QueryException: Criteria objects cannot be created directly on components.  Create a criteria on owning entity and use a dotted property to access component property: id
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getPathInfo

如何制定条件查询以达到kName属性以在动态sql上下文中应用基于它的过滤?

如果我没有提供足够的相关信息,请询问我忘记提供完整背景的内容。

编辑:根据Genzetto的建议,我已设法达到元素(至少现在没有给出错误)但是一旦我这样做就没有结果:

DetachedCriteria timestampFilter = DetachedCriteria.forClass(BJP.class)
            .add(Restrictions.eq("id.kName","DataSetName"))
            .setProjection(Projections.property("id.kName"));
Session currentSession = sessionFactory.getCurrentSession();
Criteria query = currentSession.createCriteria(BJI.class)
            .add(Subqueries.propertyEq("bJP",timestampFilter))

在查看SQL时,格式为

... where this_.J_INST_ID = (select this_.K_NAME as y0_ from .B_J_P this_ where this_.K_NAME=?)

它试图将子查询添加到根对象的ID中,尽管我希望它是bJP的一部分。如何将其添加到正确的位置?

1 个答案:

答案 0 :(得分:0)

您无需使用别名来执行此操作。您可以直接访问复合键属性:

DetachedCriteria timestampFilter = DetachedCriteria.forClass(BJP.class)
            .add(Restrictions.eq("id.kName","DataSetName"))
            .setProjection(Projections.property("id.kName"));