Предотвращение запроса дочернего объекта в Hibernate - PullRequest
0 голосов
/ 19 марта 2012

У меня есть два класса POJO Quote и RQuote, где RQuote определяется как дочерний элемент Quote. В двух соответствующих файлах hbm.xml связь между этими двумя классами не определена.

Проблема в том, что у меня есть hql как «выберите сумму (q.packagePrice) из цитаты q». Этот 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 голосов
/ 20 марта 2012

Это ваша ошибка:

RQuote extends Quote  

Вы определяете RQuote как подкласс Quote.Следовательно, каждый экземпляр RQuote также является экземпляром Quote.

Теперь, когда Hibernate оценивает select sum(q.packagePrice) from Quote q, он сначала просматривает в своем кэше все экземпляры Quote, которые уже загружены, итам он также находит экземпляры RQuote, которые тоже являются экземплярами Quote, и использует их.В результате все RQuote, которые были загружены ранее любым другим запросом в том же сеансе, будут включены в вашу сумму.

Также Query.list () или Query.uniqueResult не будут работать должным образом.

Так что вы должны исправить свой класс Java RQuote и не позволять ему расширять цитату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...