GROUP BY WITHOUT PROJECTION: Điều này không có ý nghĩa, trong nhiều câu trả lời bạn có thể tìm thấy, Nhưng hầu hết mọi người không muốn sử dụng phép chiếu, vì nó yêu cầu họ chiếu từng thuộc tính, nhưng yêu cầu là một hạt đậu phải được chiếu. (và trả về kết quả). Ví dụ dưới đây tôi đã cố gắng project
yêu cầu bean
làm đối tượng kết quả.
Tôi đã đạt được kết quả tương tự với một chút mẹo tôi tin, Trước tiên tôi đã cố gắng áp dụng nhóm mà không cần chiếu nhưng tôi đã không tìm thấy giải pháp, vì vậy tôi phải dựa vào Dự đoán.
Dưới đây là những gì tôi muốn đạt được
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
Trong mã Java Tôi muốn p.*
là một lớp Parent
đó là entity bean của tôi và tôi muốn nó là duy nhất, một cách là có được danh sách kết quả trong một Đặt, nhưng tôi không thích cách này vì nhiều lý do :)
Vì vậy, tôi đã tạo Tiêu chí từ Child.class
thay vì Parent.class
và mẹo này đã hiệu quả đối với tôi.
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);
}
Nếu bạn vẫn chưa có ý tưởng ở đây là các lớp Lớp phủ thực thể được ánh xạ của tôi.
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;
}
}
và lớp con tôi
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', theo định nghĩa, bao gồm tổng hợp dữ liệu, đó là lý do tại sao Phép chiếu là cần thiết. Có lẽ nếu bạn đã thêm chi tiết hơn về các bảng và truy vấn SQL bạn muốn Hibernate tạo, chúng tôi có thể tư vấn tốt hơn. – skaffman
Tôi có một sự kiện lớp. Lớp này có một danh sách các ngày. (Thực ra, các Ngày này là lớp DateWrapper đặc biệt, kết thúc ngày và thêm một Id, vì hibernate không thể kết hợp các bộ sưu tập có giá trị vào lúc này). Tôi muốn truy vấn các sự kiện và tìm tất cả sự kiện có một hoặc nhiều sự kiện giữa x và y. Khi tôi grap truy vấn SQL, được tạo ra bởi tiêu chí-API và thêm một "GROUP BY id", nó thực hiện chính xác, những gì tôi đang tìm kiếm. Nhưng tôi không thể tìm thấy bất kỳ cách nào để tranh luận Hibernate vào việc thêm GROUP BY! –