2011-10-15 49 views
0

我有以下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 

回答

0

不能相信我错过了这一点,但这个问题实际上是在从HQL查询生成的SQL查询本条款:

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

问题是,我想查询返回客户的结果没有任何访问条目,但查询中的该子句(由休眠生成)不会返回类型为NULL的visitentrys。

这是我冬眠应该产生对我来说,返回所有结果的SQL:

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

对我来说,这似乎是在Hibernate中的一个缺陷,因为这阻止了左或右联接返回正确的结果。

+0

有趣的是,当我将LogEntry的InheritanceType更改为InheritanceType.TABLE_PER_CLASS时,它起作用。 –

0

不同的结果,我们应有这样的事实:在SQL查询你正在使用“正确的连接”,并且在HSQL上使用“正确的外部连接”时,适当地改变以获得期望的结果。

+0

不起作用,如果我在HQL中编写RIGHT JOIN,它只是将它翻译为RIGHT OUTER JOIN in SQL –