Правое внешнее соединение HQL, возвращающее частичный результат с InheritanceType.SINGLE_TABLE - PullRequest
0 голосов
/ 15 октября 2011

У меня следующий HQL-запрос:

    entityManager.createQuery("Select customer FROM VisitEntry 
visitEntry RIGHT OUTER JOIN visitEntry.customer customer
 GROUP BY customer ORDER BY max(visitEntry.date) desc").getResultList();

Это мои объекты:

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class LogEntry implements Comparable<LogEntry> {
...    
    @Column(name="LOGENTRY_DATE")
    public Calendar getDate() {
        return date;
    }

    public void setDate(Calendar calendar) {
        this.date = calendar;
    }
    @Column(name="LOGENTRY_TEXT")
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }

    @OneToOne
    public Customer getCustomer() {
        return customer;
    }
    public void setCustomer(Customer member) {
        this.customer = member;
    }

...
}

А Заказчик:

@Entity
@Table(name="CUSTOMER")
public class Customer {

    private Integer id;
    @Id
    @GeneratedValue
    @Column(name="ID")
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

}

Это переводит в следующий SQL:

   select * from LOGENTRY visitentry0_ right outer join 
CUSTOMER customer1_ on visitentry0_.customer_ID=customer1_.ID 
where visitentry0_.DTYPE in ('VisitEntry', 'TimeVisitEntry', 
'PpvVisitEntry', 'InactiveVisitEntry') group by customer1_.ID
 order by max(visitentry0_.LOGENTRY_DATE) desc

Я получаю все результаты, когда использую этот SQL-запрос непосредственно в базе данных:

SELECT CUSTOMER.MEMBER_FIRSTNAME, MAX(LOGENTRY_DATE) FROM LOGENTRY 
RIGHT JOIN CUSTOMER ON LOGENTRY.CUSTOMER_ID = CUSTOMER.ID 
GROUP BY CUSTOMER.ID ORDER BY MAX(LOGENTRY_DATE) DESC

Так что, хотя эти запросы почти идентичны, только последний возвращает мне верный результат. Первый запрос возвращает только клиентов, с которыми связан LOGENTRY, второй запрос возвращает всех клиентов (даже если с ними не связано LOGENTRY).

Результат, возвращаемый SQL-запросом (правильный):

Matthias    2011-09-22 22:31:38
Christophe  2011-09-22 22:24:03
Patrick Leander 2011-09-21 20:47:49
Thomas  2011-09-21 20:19:09
Ricky   (null)
Glenn Gunther   (null)

Результат, возвращаемый HQL-запросом (неверно):

Matthias    2011-09-22 22:31:38
Christophe  2011-09-22 22:24:03
Patrick Leander 2011-09-21 20:47:49
Thomas  2011-09-21 20:19:09

Ответы [ 2 ]

0 голосов
/ 17 октября 2011

Не могу поверить, что я пропустил это, но проблема в том, что это предложение в SQL-запросе, сгенерированном из HQL-запроса:

where visitentry0_.DTYPE in ('VisitEntry', 'TimeVisitEntry', 
'PpvVisitEntry', 'InactiveVisitEntry') 

Проблема в том, что я хочу, чтобы результат запроса возвращал клиентов без посещений, но это предложение в запросе (которое генерируется hibernate) не возвращает посещение с типом NULL.

Это SQL-код, который я должен генерировать в спящем режиме, чтобы он возвращал все результаты:

where visitentry0_.DTYPE in ('VisitEntry', 'TimeVisitEntry', 
    'PpvVisitEntry', 'InactiveVisitEntry') OR visitentry0_ IS NULL

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

0 голосов
/ 15 октября 2011

Другой результат связан с тем, что в SQL-запросе вы используете «правильное соединение», а в HSQL вы используете «правое внешнее соединение», чтобы получить желаемый результат.

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