HQL右外连接使用InheritanceType.SINGLE_TABLE返回部分结果

时间:2011-10-15 11:10:14

标签: java hibernate hql

我有以下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 :(得分: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

对我而言,这似乎是休眠中的一个缺陷,因为这可以防止左连接或右连接返回正确的结果。