3

私は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

投影法を使用して自分のやりたいことを実行する方法はありますか?

ご協力いただきありがとうございます。

4

2 に答える 2

1

必要なすべての列の投影を追加します。

    ProjectionList projectionList = Projections.projectionList();
    projectionList.add(Projections.groupProperty("cid"));
    projectionList.add(Projections.property("tagged_offers_id"));
    ...
    criteria.setProjection(projectionList);
于 2013-03-26T22:40:16.087 に答える
0

集計計算を行わずにgroupbyを使用する必要があるのはなぜか疑問です!!

group byをprojectionで使用する場合、group byで使用される特定の列は、同じ列がすでにselectステートメントで使用されていることを無視して、fetchsqlに再び含まれます。

group byによって休止状態によって生成された余分な列をマップするには、エンティティクラスにフィールドを記述して@Transientとしてマークするか、setResultTransformerを使用して別のクラスにマップする必要があります。

于 2018-04-03T09:38:28.973 に答える