JPA实体管理器createQuery来自实体,不同包但同名

时间:2016-01-14 03:18:38

标签: java hibernate jpa

我在模块中有以下实体

  

com.example.Company(table_name:COMPANIES)

     

com.example.workspace.Company(table_name:WS_COMPANIES)

在主类中,我只导入实体import com.example.Company。然后我想找到DB的所有公司

TypedQuery<Company> query = (javax.persistence.EntityManager) em.createQuery("from Company", Company.class);

然而,我在尝试查询时遇到错误

  

为TypedQuery [com.example.Company]指定的类型与查询返回类型[class com.example.workspace.Company]

不兼容

是否有任何方法可以解决此问题,并感谢是否有人可以解释实体管理器如何构建创建查询?

em.createQuery("from com.example.Company", Company.class)似乎是一种方式,但它看起来并不优雅。我可能希望将com.example.Company作为默认

以下是persistence.xml文件,类按顺序排列

<persistence-unit name="pcc-cpod-persistence-unit" transaction-type="RESOURCE_LOCAL">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <class>com.example.Company</class>
  <class>com.example.workspace.Company</class>
  <exclude-unlisted-classes>true</exclude-unlisted-classes>
</persistence-unit>

2 个答案:

答案 0 :(得分:1)

根据JPA规范:

4.3.1命名

实体在查询字符串中按实体名称指定。实体名称由名称定义 Entity注释的元素(或实体名称XML描述符元素),默认为 实体类的非限定名称。实体名称的范围在持久性单元中,必须是 在持久性单元中是唯一的。

基于此,&#34;来自公司&#34;是指名称=&#34;公司&#34;的@Entity。由于您不允许使用重复的名称,因此com.example.Company必须具有与&#34; Company&#34;不同的实体名称。如果你看一下com.example.Company的@Entity定义,你应该找到它的名字,如果你在SELECT查询中使用那个名字,你应该得到你想要的结果。

答案 1 :(得分:1)

您可以使用“Entity”注释的“name”属性来区分共享相同类名的实体,并且可以在构建JPQL查询时引用此名称“attribute”中指定的值。

在你的情况下,你可以

@Entity(name="DefaultCompany")
@Table(name="COMPANIES")
for com.example.Company

@Entity(name="WSCompany")
@Table(name="WS_COMPANIES")
for com.example.workspace.Company 

在您的查询中,您可以参考以下实体:

em.createQuery("from DefaultCompany", Company.class);
em.createQuery("from WSCompany", Company.class);