从具有两个实现类的接口中选择HQL的结果是什么

时间:2014-12-02 06:37:52

标签: java hibernate hql

我有一个名为Customer的接口,这两个类CustomerImplOwnerCustomerImpl都实现了这个接口,然后我有一个像"select customer from Customer customer where customer.username=:username"这样的HQL,所以这是什么结果HQL?

我总是得到CustomerImpl的对象,但我真的想得到OwnerCustomerImpl

我也读过像:

这样的文档
  

14.8。多态查询

     

如下的查询:

     

来自Cat as cat

     

不仅返回Cat的实例,还返回像DomesticCat这样的子类。 Hibernate查询可以命名from子句中的任何Java类或接口。该查询将返回扩展该类或实现该接口的所有持久化类的实例。以下查询将返回所有持久对象:

     

来自java.lang.Object o

     

Named接口可能由各种持久化类实现:

     

来自Named n,命名为m,其中n.name = m.name

     

最后两个查询将需要多个SQL SELECT。这意味着order by子句没有正确排序整个结果集。这也意味着您无法使用Query.scroll()调用这些查询。

我认为,结果应该包括这两个类,所以有人可以帮忙解释一下吗?

1 个答案:

答案 0 :(得分:0)

是的,根据Hibernate,应该返回CustomerImplOwnerCustomerImpl个实例。检查是否有两个类的持久化实例。

同时检查你是否真的实现了相同的Customer接口(而不是另一个接口的接口)。

同时检查结果是否不是完整列表(例如只是前X个元素),因为如果结果是有限的,那么Hibernate可能会选择首先返回符合您标准的CustomerImpl个实例并包括之后OwnerCustomerImpl

此外,您可能只是没有任何符合查询条件的OwnerCustomerImpl个持久化实例。