0

次の SQL クエリと同じ動作をする条件クエリを作成したいと考えています。

SELECT Count(*)
FROM Datagathering_respuestas, Datagathering
WHERE Datagathering.document = 4 AND Datagathering.id_datagathering = datagathering_respuestas.id_datagathering
GROUP BY respuesta;

次のクラスのすべてです。

public class DataGathering {
    private int id;
    private Usuario user;
    private Date fecha;
    private int individual;
    private DataDocument document;
    private List<String> respuestas;

対応するマッピング ファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="pe.com.abf.pws.clases.DataGathering">
    <id column="id_datagathering" name="id">
      <generator class="identity"/>
    </id>
    <many-to-one class="pe.com.abf.pws.clases.DataDocument" name="document"/>
    <many-to-one class="pe.com.abf.pws.clases.Usuario" name="user"/>
    <property name="individual"/>
    <property name="fecha" type="timestamp"/>
    <list name="respuestas">
      <key column="id_datagathering"/>
      <index column="idx_respuesta"/>
      <element column="respuesta" length="4000" type="string"/>
    </list>
  </class>
</hibernate-mapping>

ここでの私の主な問題は、グループ化プロパティ「respuestas」が文字列型の要素のリストとして定義されており、独自のクラスを持たないことです。SQL では対応するテーブルを参照するだけで簡単ですが、Criteria では要素を参照してグループ化する方法がわかりません。私はこのクエリを取得することができました:

        Criteria c = s.createCriteria(DataGathering.class);
        c.add(Restrictions.eq("document.id", id));
        c.createCriteria("respuestas","resp");
        c.setProjection(Projections.projectionList().add(Projections.rowCount()));

これは上記の SQL クエリと同じ動作をしますが、group by 要素がないため、近いと思います。ここでも問題は、"respuestas" 内の値を参照する方法がわからないことです。

クエリを完了する方法はありますか? どんな助けでも大歓迎です。

4

1 に答える 1

0

私は次のことを行うことでこれを行うことができました:

da = s.createCriteria(DataGathering.class)
        .add(Restrictions.eq("document.id", id))
        .createCriteria("respuestas","resp")
        .setProjection(Projections.projectionList()
                .add(Projections.groupProperty("resp.elements").as("resp"))
                .add(Projections.count("resp.elements").as("amount")))
        .setResultTransformer(Transformers.aliasToBean(EncuestaHelper.class))
        .list();

トリックは、Criteria がキー"elements"を使用してプレーンな要素コレクションを参照することです。次に、特別なクラスのプロパティと一致する射影エイリアスを指定すると、そのクラスのリストを簡単に作成してレポートで使用できます。

助けようとした人に感謝します

于 2012-04-26T06:30:42.187 に答える