我想创建一个与下面的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”被定义为string类型的元素列表,并且没有它自己的类。在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查询具有相同的行为但没有按元素分组,所以我认为我就在附近。问题是我不知道如何引用“respuestas”中的值。
任何想法如何完成我的查询?任何帮助将受到高度赞赏。
答案 0 :(得分: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"
来引用普通元素集合。然后,给出与特殊类的属性匹配的投影别名,您可以轻松地创建该类的列表以在报告中使用它。
感谢任何试图提供帮助的人