私は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;
}
これにより、次の(機能する)SQLクエリが作成されます。
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;
}
これにより、私が探しているSQLがほぼ作成されますが、後でクラスキャスト例外がスローされます(オブジェクト全体ではなく、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
投影法を使用して自分のやりたいことを実行する方法はありますか?
ご協力いただきありがとうございます。