2009-11-13 29 views
0

我有一个一到许多关系的实体2:的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> 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; 
    } 

} 

Devices.java:

public class Devices implements java.io.Serializable { 

    private Integer devId; 
    private String devName; 
    private Date lastUpdate; 
    private OfficeView officeView; 

getters and setters 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "office_id") 
    public OfficeView getOfficeView() { 
     return officeView; 
    } 

    public void setOfficeView(OfficeView officeView) { 
     this.officeView = officeView; 
    } 

} 

对于一些设备,除了lastUpdate,表中有两个几乎相同的条目。我总是想要检索表格中最近的条目。只有那个条目。

例如,你有2项此设备:

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

当我加载OfficeView包含此(和其他设备)的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_view和devices表并获取所有正确的数据。但是我不能使用这个查询来加载实例(就像在createNativeQuery中一样),因为来自devices表的数据需要作为Devices对象列表加载。

我真的希望这是有道理的,因为我完全难倒了。

april26

回答

0

你必须override collection loader - 要知道,这是一个Hibernate扩展JPA标准。您可以使用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; 
} 

的实际查询的是你有附加条件上面写上office_id的一个,它的参数值是要由Hibernate提供:

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 = ? 

如果名称在整个你就不是唯一必须重写以上内容才能明确加入office id,因为您无法重复使用?占位符。

要非常小心以更新/上Office删除Devices通过收集,休眠试图优化某些操作和最终可能会删除装置用于未由上述选择检索给出Office

+0

我知道你会通过ChssPly76!谢谢。我会试试这个。我不会在我的应用程序中更新或删除设备,所以这不会成为问题。 – april26 2009-11-16 11:58:28