Um mit einer Criteria Abfrage in Hibernate ein SELECT in einem SELECT verwenden zu können, wird vom criteria-Objekt eine weiteres criteria-Objekt erzeugt.
Criteria criteria = getSession().createCriteria(XY.class);
criteria.add(Restrictions.like("attr1", '12'));
criteria.add(Restrictions.eq("attr2", true));
criteria.add(Restrictions.eq("attr3", false));
Criteria childCriteria = criteria.createCriteria("xyz");
childCriteria.add(Restrictions.between("date", von, bis));
//Sortierung der Liste nach attr1 aufsteigend
criteria.addOrder(Order.asc("attr1"));
List result = criteria.list();
Die Klassen bzw. Tabellen zu der Abfrage sehen wir folgt aus:
@Entity
@javax.persistence.Table(name = "XY")
@Table(appliesTo = "XY")
public class XY implements Serializable {
private static final long serialVersionUID = -9L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long attr1;
private boolean attr2;
private boolean attr3;
@OneToMany(targetEntity = XYZ.class, cascade = CascadeType.ALL)
@JoinTable(name = "XY_XYZ")
private List xyz;
}
@Entity
@javax.persistence.Table(name = "XYZ")
@Table(appliesTo = "XYZ")
public class XYZ implements Serializable {
private static final long serialVersionUID = 29L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private Date date;
}