防止在Hibernate中查询子对象

时间:2012-03-19 14:27:17

标签: java hibernate

我有两个POJO类Quote和RQuote,其中RQuote被定义为Quote的子级。在两个相应的hbm.xml文件中,两个类之间没有定义关系。

问题是,我有一个hql作为"从引用q"中选择sum(q.packagePrice)。这个hql将查询Quote和RQuote对象,因此它返回两个和值。

我希望sum函数仅在Quote对象上运行,而不是在其子RQuote上运行。无论如何在Hibernate中这样做?谢谢你的帮助。

引用

public class Quote extends Base implements Auditable {
    protected Client user;
    protected Package subscriptionPackage;

    // Default noarg constructor
    public Quote() {}

    // Accessors

    public Client getUser() {
        return user;
    }

    public void setUser(Client user) {
        this.user = user;
    }

    public Package getSubscriptionPackage() {
        return subscriptionPackage;
    }

    public void setSubscriptionPackage(Package subscriptionPackage) {
        this.subscriptionPackage = subscriptionPackage;
    }


    public String getType() {
        return "Quote";
    }

}

public class RQuote extends Quote  {

    // Default noarg constructor
    public RQuote() {}

    public String getType() {
        return "RQuote";
    }

}

1 个答案:

答案 0 :(得分:0)

这是你的错误:

RQuote extends Quote  

您将RQuote定义为Quote的子类。因此,RQuote 的每个实例也是的一个实例。

现在,当Hibernate正在评估select sum(q.packagePrice) from Quote q时,它首先会在其缓存中查找已加载的所有Quote实例,并在那里找到RQuote的实例,它们也是Quote的实例,并使用它们。因此,之前由同一会话中的任何其他查询加载的所有RQuote都将包含在您的总和中。

此外,Query.list()或Query.uniqueResult将无法按预期工作。

所以你必须纠正你的Java类RQuote并且不要让它扩展Quote。