这个问题来自于我尝试将JPA EntityManager合同与Hibernate Session契约统一起来。其中一个示例方法是名为createQuery
的重载方法。 Session从其超级契约中继承了此方法的多种形式。 Session然后尝试扩展EntityManager,然后继承EntityManager定义的createQuery
表单。
当我尝试使用Session来创建一个给定HQL / JPQL字符串的查询时,编译器抱怨说调用是不明确的,特别是2种方法匹配:
Query createQuery(String queryString)
<T> Query<T> createQuery(CriteriaQuery<T> criteria)
我找到的唯一解决方案是明确&#34;覆盖&#34; Session本身的每一种形式。我们推测,不知何故&#34;统一&#34;类型参数(<T>
)分辨率。但我真的很想了解这背后的原因。有什么想法吗?除了在Session上显式覆盖每个表单之外,还有更好的解决方法吗?
更长的版本......:)
Hibernate为用户定义了Session契约和StatelessSession契约。每个方法都定义了一组通用的方法,还有各自独立的方法。这组常用方法的一部分是创建Query对象的能力:
interface QueryProducer {
Query createQuery(String queryString);
...
}
我要完成的是让Hibernate的Session(但不是StatelessSession!)合同扩展JPA EntityManager。所以在这方面,Session继承了QueryProducer
方法,但也继承了EntityManager
方法,例如:
interface EntityManager {
Query createQuery(String queryString);
TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery);
...
}
每当我尝试使用其中一种常用的方法时,我都会看到#createQuery(String)
和#createQuery(CriteriaQuery<T>)
之间方法调用不明确的问题警告。