我对Hibernate相对较新,在我的hibernate类中添加“明显”限制时遇到问题。
@Entity
public class TaggedOffer {
private Long tagged_offers_id;
private String brand;
private Long cid;
private Date created_date;
//Getter and Setter and more fields
}
以前,我们正在创建一个hibernate查询,如下所示:
public DetachedCriteria build(final TaggedOfferRequest request) {
DetachedCriteria criteria = DetachedCriteria.forClass(TaggedOffer.class);
criteria.add(Restrictions.eq("brand", request.getBrand()));
criteria.add(Restrictions.in("cid", request.getCids()));
// sort by date
criteria.addOrder(Property.forName("createdDate").desc());
return criteria;
}
这将创建以下(工作)HQL查询:
select
this_.tagged_offers_id as tagged1_2_3_,
this_.brand as brand2_3_,
this_.cid as cid2_3_,
this_.created_date as created6_2_3_
from
site.tagged_offers this_
where
this_.brand=?
and this_.country_code=?
and this_.cid in (
?, ?
)
order by
this_.created_date desc limit ?
这是棘手的部分。我们现在需要确保返回的结果在'cid'字段中是不同的。意思是,返回尽可能多的结果,提供每条记录都有一个与之关联的唯一cid。
我在SQL中研究过这个问题,看起来最简单的方法就是在查询中设置一个'group by cid'。就休眠标准而言,这基本上就是我一直在尝试的:
public DetachedCriteria build(final TaggedOfferRequest request) {
DetachedCriteria criteria = DetachedCriteria.forClass(TaggedOffer.class);
criteria.add(Restrictions.eq("brand", request.getBrand()));
criteria.add(Restrictions.in("cid", request.getCids()));
// sort by date
criteria.addOrder(Property.forName("createdDate").desc());
// ** new ** distinct criteria
criteria.setProjection(Projections.groupProperty("cid"));
return criteria;
}
这几乎创建了我正在寻找的hql,但它后来抛出了一个类转换异常(因为它只是选择了cid字段而不是整个对象)。
select
this_.cid as y0_
from
site.tagged_offers this_
where
this_.brand=?
and this_.country_code=?
and this_.cid in (
?, ?
)
and tagtype1_.tag_type=?
group by
this_.cid
order by
this_.created_date desc limit ?
例外:
java.lang.ClassCastException: java.lang.Long cannot be cast to com.mycompany.site.taggedoffers.dao.model.TaggedOffer
知道如何使用投影来做我想要的事情吗?
感谢您的帮助。
答案 0 :(得分:1)
为您需要的所有列添加投影。
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.groupProperty("cid"));
projectionList.add(Projections.property("tagged_offers_id"));
...
criteria.setProjection(projectionList);
答案 1 :(得分:0)
我怀疑为什么需要在这里使用group而不进行任何聚合计算!!
如果你使用group by with projection,那么group by中使用的特定列将再次包含在fetch sql中,忽略即使在select语句中已经使用了相同的列。
要映射hibernate生成的额外列,因为你需要在实体类中编写一个字段并将其标记为@Transient,或者你可以使用setResultTransformer并映射到另一个类