2014-06-18 26 views
1

你好我想在一個標準引用其定義爲和@Embeddable對實體休眠QueryException

@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的一部分。我如何將它添加到適當的位置?

回答

0

您不需要使用別名來執行此操作。您可以直接訪問複合鍵屬性:

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

謝謝!您的評論很有幫助,但不幸遇到了問題,請問您有什麼解決方案可以解決我當前的問題嗎? –

+0

你有什麼問題? – Genzotto

+0

在我的帖子頂部添加了它作爲末尾編輯 –