Hibernate查询与获取问题

Hibernate查询与获取问题,hibernate,Hibernate,我在一对多关系中有两个实体: OfficeView.java: public class OfficeView implements java.io.Serializable { private Integer officeId; private String addr1; private String city; private String state; private String zip; private List<Devices&

我在一对多关系中有两个实体:

OfficeView.java:

public class OfficeView implements java.io.Serializable {

    private Integer officeId;
    private String addr1;
    private String city;
    private String state;
    private String zip;
    private List<Devices> devices;

getters and setters

    @OneToMany(mappedBy = "officeView", fetch = FetchType.EAGER)
    public List<Devices> getDevices() {
        return devices;
    }

    public void setDevices(List<Devices> devices) {
        this.devices = devices;
    }

}
对于某些设备,表中有2个几乎相同的条目,但lastUpdate除外。我总是想检索表中最近的条目。只有那个条目

例如,此设备有2个条目:

SSA-PITTSB-PA-NEF82 2009-10-12 23:51:07 SSA-PITTSB-PA-NEF82 2009-10-15 14:19:35

当我加载包含此设备(和其他设备)的office的OfficeView实例时,我只想获取这两个设备中最新的一个。在数据库中,我可以通过以下SQL查询从设备表中获取短列表:

select t.* from
  (select dev_id, dev_name, max(last_update) maxValue 
from devices
  group by dev_name) x
join devices t on x.dev_name=t.dev_name
and x.maxValue=t.last_update
SSA-PITTSB-PA-NEF82 2009-10-15 14:19:35

这是一个seam应用程序,从中调用查询的OfficeViewHome.java扩展了EntityHome。我认为正确的方法是使用自定义查询重载loadInstance

我只是不知道如何构造查询。我该怎么做

我知道如何用SQL编写联接查询,以联接oFfice_视图和设备表,并获取所有正确的数据。但我无法使用此查询加载实例(如createNativeQuery中),因为设备表中的数据需要作为设备对象列表加载

我真的希望这有意义,因为我完全被难倒了

4月26日

您必须知道,这是JPA标准的Hibernate扩展。您可以使用SQL查询来完成这项工作,而不是编写HQL—实际上,在这种情况下编写HQL可能有些麻烦

@Loader(namedQuery = "latestDevices")
@NamedNativeQuery(name="latestDevices", query="...", resultClass = Devices.class)
@OneToMany(mappedBy = "officeView", fetch = FetchType.EAGER)
public List<Devices> getDevices() {
  return devices;
}
如果名称在整个过程中不唯一,则必须重写上述内容,以明确加入内部select的id上的
office
,因为您不能重复
占位符


通过收集
Office
更新/删除
设备时要非常小心,Hibernate会尝试优化某些操作,最终可能会删除上述选择未检索到的给定
Office
设备。

我就知道您会通过CHSSLY76!谢谢我要试试这个。我不会在我的应用程序中更新或删除任何设备,所以这不会是一个问题。
@Loader(namedQuery = "latestDevices")
@NamedNativeQuery(name="latestDevices", query="...", resultClass = Devices.class)
@OneToMany(mappedBy = "officeView", fetch = FetchType.EAGER)
public List<Devices> getDevices() {
  return devices;
}
select t.* from
 (select dev_id, dev_name, max(last_update) maxValue 
    from devices
   group by dev_name) x
  join devices t on x.dev_name=t.dev_name
   and x.maxValue=t.last_update
   and t.office_id = ?