是否可以在JPA中按引用实体进行分组选择数据?
我的意思是:我有两个实体-保险和引用的多对一工具。保险实体具有有效的耕种字段(当然还有车辆领域)。
我想选择车辆,这是最新的保险。以下查询不起作用:
SELECT DISTINCT v.vehicle, max(v.validTill) as lastValidTill FROM TraInsurance v GROUP BY v.vehicle ORDER BY lastValidTill
上面的查询因错误而失败:
ERROR: column "travehicle1_.id_brand" must appear in the GROUP BY clause or be used in an aggregate function
这是因为JPA将引用车辆的所有字段添加到查询中,而不是添加到GROUP BY。我在这里做错了吗?也许这是不可能的?
编辑:
TraInsurance实体
@Entity @Table(name = "TRA_INSURANCES", schema="public") @SequenceGenerator(name = "TRA_INSURANCES_SEQ", sequenceName = "TRA_INSURANCES_SEQ", allocationSize = 1) public class TraInsurance implements EntityInt, Serializable { private static final long serialVersionUID = 1L; @Id @Column(name = "id", nullable = false) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TRA_INSURANCES_SEQ") private Long id; @NotNull @ManyToOne @JoinColumn(nullable = false, name = "id_vehicle") private TraVehicle vehicle; @NotNull @Column(name = "valid_from", nullable = false) private Date validFrom; @Column(name = "valid_till", nullable = false) private Date validTill; @NotNull @ManyToOne @JoinColumn(nullable = false, name = "id_company") private Company company; @Column(name = "policy_no", nullable = true, length = 50) private String policyNumber; @Column(name = "rate", nullable = true, precision = 12, scale = 2) private BigDecimal rate; @Column(name = "discount_percent", nullable = true) private Float discountPercent; @Column(nullable = true) private String description; public TraInsurance() {} public Long getId() { return id; } public void setId(Long id) { this.id = id; } public TraVehicle getVehicle() { return vehicle; } public void setVehicle(TraVehicle vehicle) { this.vehicle = vehicle; } public Date getValidFrom() { return validFrom; } public void setValidFrom(Date validFrom) { this.validFrom = validFrom; } public Date getValidTill() { return validTill; } public void setValidTill(Date validTill) { this.validTill = validTill; } public Company getCompany() { return company; } public void setCompany(Company company) { this.company = company; } public String getPolicyNumber() { return policyNumber; } public void setPolicyNumber(String policyNumber) { this.policyNumber = policyNumber; } public BigDecimal getRate() { return rate; } public void setRate(BigDecimal rate) { this.rate = rate; } public Float getDiscountPercent() { return discountPercent; } public void setDiscountPercent(Float discountPercent) { this.discountPercent = discountPercent; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((validFrom == null) ? 0 : validFrom.hashCode()); result = prime * result + ((vehicle == null) ? 0 : vehicle.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof TraInsurance)) return false; TraInsurance other = (TraInsurance) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (validFrom == null) { if (other.validFrom != null) return false; } else if (!validFrom.equals(other.validFrom)) return false; if (vehicle == null) { if (other.vehicle != null) return false; } else if (!vehicle.equals(other.vehicle)) return false; return true; } }
在这种情况下,请明确使用 JOIN :
SELECT ve, MAX(v.validTill) FROM TraInsurance v JOIN v.vehicle ve GROUP BY ve ORDER BY MAX(v.validTill)