我有两个实体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接口,如下所示:

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接口将所有字段保留为group by?
如果有人指导我,请告诉我们。

最佳答案

我们可以使用投影来缩小选定列的列表,但随后我们必须确定


我们是否将结果表示为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。看到:


17.9. Projections, aggregation and grouping



alias()as()方法只是将一个投影实例包装在另一个别名的Projection实例中。


或者我们可以预期结果为object[]

Object[] results = contentCriteria.list();


延伸:

如果我们要获取路线实体列表,可以将当前查询转换为DetachedCriteria

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


因此,上面的代码仅返回我们喜欢的ID,并且主查询将被它们过滤,同时返回完整的对象(无需转换)

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


在此处检查类似的内容:Hibernate Criteria for "in subselect"

关于java - 通过出错的组 hibernate 标准,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25621185/

10-12 03:17
查看更多