GROUP BY無預測:它是不可能的,因爲它是有道理的,在許多答案中你可能會發現,但大多數人不想使用投影,因爲它要求他們投影每一個屬性,但要求是一個豆必須投影。 (並作爲結果返回)。在下面的例子中,我試圖以project
所需的bean
作爲結果對象。
我已經實現了相同的結果特技的一點點,我相信,首先我是想通過無投影應用組,但我沒有發現任何解決方案,所以我必須依靠投影。
這是我想達到
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
在Java代碼中,我想p.*
成爲Parent
類,這是我的實體bean,我想這是唯一的,一個辦法是得到一個結果列表設置,但我不喜歡這種方式,由於很多原因:)
所以我創建了一個標準Child.class
而不是Parent.class
,這個技巧爲我工作。
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);
}
如果你還沒有想到這裏是我的映射實體Bean類。
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;
}
}
和我的孩子上課
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」根據定義,涉及數據的彙總,這就是投影必要的原因。也許如果你添加了表格的更多細節,以及你希望Hibernate生成的SQL查詢,我們可以提供更好的建議。 – skaffman
我有一個類的事件。這個類有一個日期列表。 (實際上這些日期是一個特殊的DateWrapper類,它封裝了Date並添加了一個Id,因爲hibernate現在不能加入值類型的集合)。 我想查詢事件並查找x和y之間的一個或多個事件的所有事件。 當我抓取由Criteria-API生成的SQL-Query並添加一個「GROUP BY id」時,它確實,我正在尋找。但我找不到任何方式來爭論Hibernate加入GROUP BY! –