我有以下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
答案 0 :(得分:0)
不同的结果是因为在sql查询中你正在使用“正确的连接”,而在HSQL上你正在使用“右外连接”改变以适当地获得所需的结果。
答案 1 :(得分:0)
无法相信我错过了这个,但问题实际上是从HQL查询生成的SQL查询中的这个子句:
where visitentry0_.DTYPE in ('VisitEntry', 'TimeVisitEntry',
'PpvVisitEntry', 'InactiveVisitEntry')
问题是我希望查询的结果返回没有任何访问条件的客户,但查询中的那个子句(由hibernate生成)不会返回类型为NULL的visitentrys。
这是我休眠的SQL应该为我生成的返回所有结果的SQL:
where visitentry0_.DTYPE in ('VisitEntry', 'TimeVisitEntry',
'PpvVisitEntry', 'InactiveVisitEntry') OR visitentry0_ IS NULL
对我而言,这似乎是休眠中的一个缺陷,因为这可以防止左连接或右连接返回正确的结果。