Обсуждение: Hibernate Query Question - Get most recent unique rows
Given the two classes at the bottom of this email, I'm having trouble
coming up with a Hibernate query statement that returns a list
representing all rows in the quality_control_reset table where there is
only one row for the most recent quality_control_range. Help?
Example:
In table quality_control_reset, there are the following rows:
id | timestamp | qualitycontrolrange
---------------------------------------------
1 | 02/23/2006 | 20
2 | 02/23/2006 | 6
3 | 02/28/2006 | 18
4 | 03/01/2006 | 18
5 | 03/23/2006 | 12
6 | 03/23/2006 | 20
I want the results of the following from the query:
id | timestamp | qualitycontrolrange
---------------------------------------------
2 | 02/23/2006 | 6
4 | 03/01/2006 | 18
5 | 03/23/2006 | 12
6 | 03/23/2006 | 20
QualityControlReset.java:
package test;
import java.util.Date;
/**
* @hibernate.class table="quality_control_reset"
*/
public class QualityControlReset {
private Date date;
private QualityControlRange qualityControlRange;
public QualityControlReset() {
// noop
}
/**
* @hibernate.id generator-class="native" column="id"
*/
public Long getId() {
return id;
}
public void setId(Long long1) {
id = long1;
}
/**
* @hibernate.property not-null="true"
*/
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
/**
* @hibernate.many-to-one class="test.QualityControlRange"
cascade="none" not-null="true"
*/
public QualityControlRange getQualityControlRange() {
return qualityControlRange;
}
public void setQualityControlRange(QualityControlRange
qualityControlRange) {
this.qualityControlRange = qualityControlRange;
}
}
QualityControlRange.java:
package test;
/**
* @hibernate.class table="quality_control_range"
*/
public class QualityControlRange {
private String code;
public QualityControlRange() {
}
/**
* @hibernate.id generator-class="native" column="id"
*/
public Long getId() {
return id;
}
public void setId(Long long1) {
id = long1;
}
/**
* @hibernate.property
*/
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
OK. The following how to do this in SQL. How does this convert into HQL?
select distinct on (qualitycontrolrange) qualitycontrolrange, date, id
from quality_control_reset
order by qualitycontrolrange, date desc;
Julie Robinson wrote:
> Given the two classes at the bottom of this email, I'm having trouble
> coming up with a Hibernate query statement that returns a list
> representing all rows in the quality_control_reset table where there is
> only one row for the most recent quality_control_range. Help?
>
> Example:
>
> In table quality_control_reset, there are the following rows:
>
> id | date | qualitycontrolrange
> ---------------------------------------------
> 1 | 02/23/2006 | 20
> 2 | 02/23/2006 | 6
> 3 | 02/28/2006 | 18
> 4 | 03/01/2006 | 18
> 5 | 03/23/2006 | 12
> 6 | 03/23/2006 | 20
>
> I want the results of the following from the query:
>
> id | date | qualitycontrolrange
> ---------------------------------------------
> 2 | 02/23/2006 | 6
> 4 | 03/01/2006 | 18
> 5 | 03/23/2006 | 12
> 6 | 03/23/2006 | 20
>
>
>
> QualityControlReset.java:
>
> package test;
>
> import java.util.Date;
>
> /**
> * @hibernate.class table="quality_control_reset"
> */
> public class QualityControlReset {
> private Date date;
> private QualityControlRange qualityControlRange;
>
> public QualityControlReset() {
> // noop
> }
>
> /**
> * @hibernate.id generator-class="native" column="id"
> */
> public Long getId() {
> return id;
> }
>
> public void setId(Long long1) {
> id = long1;
> }
>
> /**
> * @hibernate.property not-null="true"
> */
> public Date getDate() {
> return date;
> }
>
> public void setDate(Date date) {
> this.date = date;
> }
>
> /**
> * @hibernate.many-to-one class="test.QualityControlRange"
> cascade="none" not-null="true"
> */
> public QualityControlRange getQualityControlRange() {
> return qualityControlRange;
> }
>
> public void setQualityControlRange(QualityControlRange
> qualityControlRange) {
> this.qualityControlRange = qualityControlRange;
> }
> }
>
>
> QualityControlRange.java:
>
> package test;
>
> /**
> * @hibernate.class table="quality_control_range"
> */
> public class QualityControlRange {
> private String code;
>
> public QualityControlRange() {
> }
>
> /**
> * @hibernate.id generator-class="native" column="id"
> */
> public Long getId() {
> return id;
> }
>
> public void setId(Long long1) {
> id = long1;
> }
>
> /**
> * @hibernate.property
> */
> public String getCode() {
> return code;
> }
>
> public void setCode(String code) {
> this.code = code;
> }
> }
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly
>
>
>
>
On Fri, Mar 24, 2006 at 12:13:24PM -0600, Julie Robinson wrote:
> OK. The following how to do this in SQL. How does this convert into HQL?
>
> select distinct on (qualitycontrolrange) qualitycontrolrange, date, id
> from quality_control_reset
> order by qualitycontrolrange, date desc;
That won't do what you described below. I think what you want is this:
SELECT quality_control_range, max(date) FROM quality_control_reset GROUP BY
qualitycontrolrange;
If you need id, just wrap the above in a subquery and join against it.
> Julie Robinson wrote:
> >Given the two classes at the bottom of this email, I'm having trouble
> >coming up with a Hibernate query statement that returns a list
> >representing all rows in the quality_control_reset table where there is
> >only one row for the most recent quality_control_range. Help?
> >
> >Example:
> >
> >In table quality_control_reset, there are the following rows:
> >
> >id | date | qualitycontrolrange
> >---------------------------------------------
> >1 | 02/23/2006 | 20
> >2 | 02/23/2006 | 6
> >3 | 02/28/2006 | 18
> >4 | 03/01/2006 | 18
> >5 | 03/23/2006 | 12
> >6 | 03/23/2006 | 20
> >
> >I want the results of the following from the query:
> >
> >id | date | qualitycontrolrange
> >---------------------------------------------
> >2 | 02/23/2006 | 6
> >4 | 03/01/2006 | 18
> >5 | 03/23/2006 | 12
> >6 | 03/23/2006 | 20
> >
> >
> >
> >QualityControlReset.java:
> >
> >package test;
> >
> >import java.util.Date;
> >
> >/**
> > * @hibernate.class table="quality_control_reset"
> > */
> >public class QualityControlReset {
> > private Date date;
> > private QualityControlRange qualityControlRange;
> >
> > public QualityControlReset() {
> > // noop
> > }
> >
> > /**
> > * @hibernate.id generator-class="native" column="id"
> > */
> > public Long getId() {
> > return id;
> > }
> >
> > public void setId(Long long1) {
> > id = long1;
> > }
> >
> > /**
> > * @hibernate.property not-null="true"
> > */
> > public Date getDate() {
> > return date;
> > }
> >
> > public void setDate(Date date) {
> > this.date = date;
> > }
> >
> > /**
> > * @hibernate.many-to-one class="test.QualityControlRange"
> >cascade="none" not-null="true"
> > */
> > public QualityControlRange getQualityControlRange() {
> > return qualityControlRange;
> > }
> >
> > public void setQualityControlRange(QualityControlRange
> >qualityControlRange) {
> > this.qualityControlRange = qualityControlRange;
> > }
> >}
> >
> >
> >QualityControlRange.java:
> >
> >package test;
> >
> >/**
> > * @hibernate.class table="quality_control_range"
> > */
> >public class QualityControlRange {
> > private String code;
> >
> > public QualityControlRange() {
> > }
> >
> > /**
> > * @hibernate.id generator-class="native" column="id"
> > */
> > public Long getId() {
> > return id;
> > }
> >
> > public void setId(Long long1) {
> > id = long1;
> > }
> >
> > /**
> > * @hibernate.property
> > */
> > public String getCode() {
> > return code;
> > }
> >
> > public void setCode(String code) {
> > this.code = code;
> > }
> >}
> >
> >---------------------------(end of broadcast)---------------------------
> >TIP 1: if posting/reading through Usenet, please send an appropriate
> > subscribe-nomail command to majordomo@postgresql.org so that your
> > message can get through to the mailing list cleanly
> >
> >
> >
> >
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: Have you checked our extensive FAQ?
>
> http://www.postgresql.org/docs/faq
>
--
Jim C. Nasby, Sr. Engineering Consultant jnasby@pervasive.com
Pervasive Software http://pervasive.com work: 512-231-6117
vcard: http://jim.nasby.net/pervasive.vcf cell: 512-569-9461