title: JPA GROUP BY entity - is this possible?
body: <p>Is possible to select data in JPA with grouping by referenced entity?</p>
  
  <p>I mean: I have two entities - insurance and referenced many-to-one vehicle. Insurance entity has validTill field (and vehicle field of course).</p>
  
  <p>I'd like to select vehicle and it's latest insurance. The query below doesn't work:</p>
  
  <pre><code>SELECT DISTINCT v.vehicle, 
                  max(v.validTill) as lastValidTill 
  FROM TraInsurance v 
       GROUP BY v.vehicle 
       ORDER BY lastValidTill
  </code></pre>
  
  <p>The query above fails with error:</p>
  
  <pre><code>ERROR: column "travehicle1_.id_brand" must appear in the GROUP BY clause or be used in an aggregate function
  </code></pre>
  
  <p>This is because JPA adds all fields from referenced vehicle to query and not to GROUP BY. Is here something I do wrong? Or maybe it's just not possible to do this?</p>
  
  <p><strong>EDIT:</strong></p>
  
  <p>TraInsurance entity</p>
  
  <pre><code>@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;
      }  
  
  }
  </code></pre>