JPQL GROUP BY не работает как SQL GROUP BY - PullRequest
0 голосов
/ 14 декабря 2011

У меня есть эти две сущности:

Продукт - многие ко многим -> Фильтр (однонаправленный)

Я пытался сделать это заявление SQL с jqpl:

SQL:  SELECT * FROM product   JOIN filter   GROUP BY product.id;

JPQL: SELECT p FROM Product p JOIN p.filter GROUP BY p.id

SQL работает отлично. JPQL возвращает продукт для каждого фильтра, например

product1 имеет два фильтра: я получаю этот результат из psql:

Список результатов: [0] product1 [1] product1

Как получить тот же результат, что и SQL?

@Entity
public abstract class Filter<E> implements Serializable{

private static final long serialVersionUID = 1L;

@Id @GeneratedValue
private Long id;

public E getValue() {
    return value;
}

public void setValue(E value) {
    this.value = value;
}

private E value;

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

@Override
public int hashCode() {
    int hash = 0;
    hash += (id != null ? id.hashCode() : 0);
    return hash;
}   

}

@Entity
public class Product implements Serializable{

private static final long serialVersionUID = 1L;

@Id @GeneratedValue
private long id;

@OneToMany(mappedBy = "product", cascade = {CascadeType.REFRESH, CascadeType.MERGE, CascadeType.PERSIST})
private Collection<AllocationPlan> allocationPlan;

@ManyToOne
private Vendor vendor;

@Size(min = 2, max = 50)
private String title;

@Size(min = 0, max = 1000)
private String description;

@Size(min = 0, max = 200)
private String mainPicturePath;

private boolean isActive;

@ManyToMany
private Collection<Filter<?>> filter;

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public Collection<AllocationPlan> getAllocationPlan() {
    return allocationPlan;
}

public void setAllocationPlan(Collection<AllocationPlan> allocationPlan) {
    this.allocationPlan = allocationPlan;
}

public Vendor getVendor() {
    return vendor;
}

public void setVendor(Vendor vendor) {
    this.vendor = vendor;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getMainPicturePath() {
    return mainPicturePath;
}

public void setMainPicturePath(String mainPicturePath) {
    this.mainPicturePath = mainPicturePath;
}

public boolean isActive() {
    return isActive;
}

public void setActive(boolean isActive) {
    this.isActive = isActive;
}

@Override
public boolean equals(Object obj){
    return ((obj instanceof Product) && 
            id == ((Product)obj).getId());
}

public Collection<Filter<?>> getFilter() {
    return filter;
}

public void setFilter(Collection<Filter<?>> param) {
    this.filter = param;
}

}

...