2014-09-02 41 views
0

我有這兩個實體Java類是引用表(jos_content & jos_article_section)。休眠標準與組通過獲取錯誤

@Entity 
@Table(name="jos_content", 
uniqueConstraints={@UniqueConstraint(columnNames="id")}) 
public class ContentEntity implements Serializable { 
private int id; 
private Set<ArticleSectionEntity> josArticleSection;  
private String sefUrl; 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name="id", unique = true, nullable = false) 
public int getId() { 
    return id; 
} 
public void setId(int id) { 
    this.id = id; 
} 

@Column(name="sef_url") 
public String getSefUrl() { 
    return sefUrl; 
} 
public void setSefUrl(String sefUrl) { 
    this.sefUrl = sefUrl; 
} 

@OneToMany(cascade = CascadeType.ALL) 
@JoinColumn(name="article_id") 
public Set<ArticleSectionEntity> getJosArticleSection() { 
    return josArticleSection; 
} 
public void setJosArticleSection(Set<ArticleSectionEntity> josArticleSection) { 
    this.josArticleSection = josArticleSection; 
} 
} 


@Entity 
@Table(name="jos_article_section", uniqueConstraints= {@UniqueConstraint(columnNames="id")}) 
public class ArticleSectionEntity implements Serializable { 
private int id; 
private int articleId; 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name="id", nullable=false, length=10) 
public int getId() { 
    return id; 
} 
public void setId(int id) { 
    this.id = id; 
} 

@Column(name="article_id", nullable=false) 
public int getArticleId() { 
    return articleId; 
} 
} 

我使用的是組標準接口,通過這樣的:

Criteria contentCriteria = session.createCriteria(ContentEntity.class, "content"); 
// Join two tables (jos_content, jos_article_section) on jos_content.id =  jos_acticle_section.article_id 
contentCriteria = contentCriteria.setFetchMode("josArticleSection", FetchMode.JOIN); 
contentCriteria = contentCriteria.add(Restrictions.eq("content.id", storyId)); 
contentCriteria = contentCriteria.add(Restrictions.eq("content.state",1));   

//Start Group By Clause 
PropertyProjection propProjection = Projections.groupProperty("content.id"); 
contentCriteria = contentCriteria.setProjection(propProjection); 
//End Group By 

當我跑我的申請,我得到這個輸出,錯誤爲:

contentCriteria >>>> CriteriaImpl(com.itgd.entity.ContentEntity:content[][content.id=374821, content.state=1]content.id) 
14:24:39,649 INFO [STDOUT] Hibernate: select this_.id as y0_ from jos_content this_ where this_.id=? and this_.state=? group by this_.id 
14:24:39,659 ERROR [STDERR] java.lang.ClassCastException: java.lang.Integer cannot be cast to com.itgd.entity.ContentEntity 

如何我是否必須解決這個錯誤,是否有可能使用Criteria接口保留所有的字段? 如果有人指導我,請讓我知道。

+0

您需要的結果變壓器像[這裏](http://stackoverflow.com/a/25616261/1679310),或者只是預期結果不會是ContentEntity - 而是投影列的數組。正是由異常說:*「結果是int(content.id)...沒有轉換爲ContentEntity * – 2014-09-02 10:29:59

+0

嗨Radim Kohler,你能簡單解釋一下嗎? – TOSHASHU123 2014-09-02 10:55:32

+0

Hi Radim Kohler, 我已經使用這個: PropertyProjection propProjection = Projections.groupProperty(「content.id」); contentCriteria = contentCriteria.setProjection(propProjection); contentCriteria = contentCriteria.setResultTransformer(Transformers.aliasToBean(ContentEntity.clas s)); 並得到所有的值爲空。 – TOSHASHU123 2014-09-02 10:58:52

回答

1

我們可以用投影,以縮小選擇列的列表,但我們必須決定

  • ,我們將表示爲object[]
  • 將我們變換結果爲DTO結果工作(如果可能的話到原始實體)

如果我們要進行轉換,我們必須幫助變壓器列名。它與通過alias

PropertyProjection propProjection = Projections 
    .groupProperty("content.id") 
     .as("id") // the alias 
    ; 

contentCriteria 
    .setProjection(propProjection) 
    .setResultTransformer(Transformers.aliasToBean(ContentEntity.clas‌​‌​s)); 

List<ContentEntity> groupedEntities = contentCriteria.list(); 

那麼結果將是ContentEntity列表,它會充滿只有id完成。請參閱:

alias()as()方法只需在投影的另一個別名,例如包裹投影實例。

,或者我們可以預期的結果爲object[]

Object[] results = contentCriteria.list(); 

EXTEND:

如果我們想獲得的路由實體的列表中,我們可以將當前的查詢轉換爲DetachedCriteria

DetachedCriteria grouped = DetachedCriteria.forClass(ContentEntity.class, "grouped") 
    // Filter the Subquery 
    .add(... 
    // SELECT The User Id 
    .setProjection(propProjection) 

因此,上述將返回我們喜歡的ID,主要查詢將是fil他們篇幅中,在返回完整的對象(無需轉換)

Criteria query = session.createCriteria(ContentEntity.class, "content") 
    .add(Subqueries.propertyIn("content.id", grouped)); 

檢查類似的東西在這裏:Hibernate Criteria for "in subselect"

+0

不工作。獲得例外 – TOSHASHU123 2014-09-02 11:34:20

+0

現在是什麼例外?它不是像以前一樣的ClassCastException? – 2014-09-02 11:39:44

+0

這是工作,但不夠,因爲我想獲取定義到ContentEntity.java文件中的所有字段。對於上述解決方案,我只能獲得一個字段值,即ID。 此外,我的查詢已更改,其顯示沒有連接。 – TOSHASHU123 2014-09-02 11:40:21