GROUP BY SIN PROYECCIÓN: No es posible, ya que tiene sentido, en muchas respuestas que pueden hallarse, pero la mayoría de la gente no quiere utilizar la proyección, ya que les obliga a proyectar todos y cada atributo, pero el requisito es que un frijol debe ser proyectado. (y regresó como resultado). En el siguiente ejemplo he intentado con project
el bean
requerido como objeto resultante.
He logrado el mismo resultado con un poco de truco. Creo que primero intenté aplicar group by sin proyección pero no encontré ninguna solución, así que tengo que confiar en Projection.
Esto es lo que quería lograr
select p.* FROM parent p INNER JOIN child c ON p.id_parent=c.id_father
WHERE c.child_name like '%?%' AND p.parent_name like '%?%'
group by p.id_parent
en código Java que quería p.*
a ser una clase Parent
que es mi bean de entidad y quería que sea único, una forma es obtener la lista de resultados de una Establecer, pero no me gusta de esta manera debido a muchas razones :)
Así que creé un Criterio de Child.class
en lugar de Parent.class
, y este truco funcionó para mí.
Criteria c = session.createCriteria(Child.class,"c");// starting from Child
c.add(Restrictions.like("childName", "abc", MatchMode.ANYWHERE));
c.createAlias("parent", "p"); //remember parent is an attribute in Child.class
c.add(Restrictions.like("p.parentName", "xyz", MatchMode.ANYWHERE));
c.setProjection(Projections.projectionList().add(Projections.groupProperty("parent"))); //projecting parent which is an attribute of Child.class
List<Parent> result = c.list(); //get the result
for (Parent p: result) {
System.out.println(p);
}
Si todavía no tiene la idea aquí están las clases de Entity Bean mapeadas.
package com.mazhar.beans;
import static javax.persistence.GenerationType.IDENTITY;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name = "parent")
public class Parent {
private Integer idParent;
private String parentName;
private List<Child> childs;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id_parent")
public Integer getIdParent() {
return idParent;
}
public void setIdParent(Integer idParent) {
this.idParent = idParent;
}
@Column(name = "parent_name")
public String getParentName() {
return parentName;
}
public void setParentName(String parentName) {
this.parentName = parentName;
}
@OneToMany(fetch=FetchType.LAZY, mappedBy="parent", cascade=CascadeType.ALL)
public List<Child> getChilds() {
return childs;
}
public void setChilds(List<Child> childs) {
this.childs = childs;
}
}
y mi clase hija
package com.mazhar.beans;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name = "child")
public class Child {
private Integer idChild;
private String childName;
private Parent parent; //this actually we projected in criteria query.
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id_city", unique = true, nullable = false)
public Integer getIdChild() {
return idChild;
}
public void setIdChild(Integer idChild) {
this.idChild = idChild;
}
@Column(name = "city_name", nullable = false)
public String getChildName() {
return childName;
}
public void setChildName(String cName) {
this.childName = cName;
}
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "id_father")
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
}
'GROUP BY', por definición, implica la agregación de datos, por lo que las proyecciones son necesarias. Quizás si agregaste más detalles de las tablas y la consulta SQL que quisieras que genere Hibernate, podríamos aconsejarte mejor. – skaffman
Tengo un evento de clase. Esta clase tiene una lista de fechas. (En realidad, estas fechas son una clase especial de DateWrapper, que envuelve la fecha y agrega una identificación, porque hibernate no puede unir las colecciones de tipo de valor en este momento). Me gustaría consultar los eventos y encontrar todos los eventos con uno o más eventos entre xe y. Cuando escribo SQL-Query, que fue generado por Criteria-API y agrego un "ID de GROUP BY", hace exactamente lo que estoy buscando. ¡Pero no puedo encontrar ninguna manera de argumentar Hibernate para agregar GROUP BY! –