使用类型参数覆盖方法

时间:2016-04-18 16:02:24

标签: java hibernate generics jpa

这个问题来自于我尝试将JPA EntityManager合同与Hibernate Session契约统一起来。其中一个示例方法是名为createQuery的重载方法。 Session从其超级契约中继承了此方法的多种形式。 Session然后尝试扩展EntityManager,然后继承EntityManager定义的createQuery表单。

当我尝试使用Session来创建一个给定HQL / JPQL字符串的查询时,编译器抱怨说调用是不明确的,特别是2种方法匹配:

  1. Query createQuery(String queryString)
  2. <T> Query<T> createQuery(CriteriaQuery<T> criteria)
  3. 我找到的唯一解决方案是明确&#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>)之间方法调用不明确的问题警告。

0 个答案:

没有答案