У меня следующий 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