我有以下HQL查詢:HQL右外連接與返回的部分結果InheritanceType.SINGLE_TABLE
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)。通過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
Ricky (null)
Glenn Gunther (null)
結果:
結果通過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
有趣的是,當我將LogEntry的InheritanceType更改爲InheritanceType.TABLE_PER_CLASS時,它起作用。 –