Java JPA实体管理器从实体创建查询,不同的包但名称相同

Java JPA实体管理器从实体创建查询,不同的包但名称相同,java,hibernate,jpa,Java,Hibernate,Jpa,我在模块中有以下实体 com.example.Company(表名称:公司) com.example.workspace.Company(表名称:WS\u companys) 在main类中,我只导入实体import com.example.Company。然后我想找到DB的所有公司 TypedQuery query=(javax.persistence.EntityManager)em.createQuery(“来自公司”,Company.class) 然而,我在它试图查询的地方得到了错误 为

我在模块中有以下实体

com.example.Company(表名称:公司)

com.example.workspace.Company(表名称:WS\u companys)

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

TypedQuery query=(javax.persistence.EntityManager)em.createQuery(“来自公司”,Company.class)

然而,我在它试图查询的地方得到了错误

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

是否有任何方法可以解决此问题,如果有人能够解释实体管理器如何构造create查询,我们将不胜感激

em.createQuery(“来自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>

org.hibernate.ejb.HibernatePersistence
com.example.Company
com.example.workspace.Company
真的

来自JPA规范:

4.3.1命名

实体在查询字符串中由其实体名称指定。实体名称由名称定义 元素(或实体名称XML描述符元素),默认为 实体类的非限定名称。实体名称在持久性单元中有作用域,并且必须为 在持久性单元中是唯一的

基于此,“from Company”是指名称为“Company”的@实体。由于不允许有重复的名称,因此com.example.Company必须与“Company”具有不同的实体名称。如果查看com.example.Company的@Entity定义,您应该会找到它的名称,如果在SELECT查询中使用该名称,您应该会得到所需的结果。

您可以使用“实体”注释的“名称”属性来区分共享相同类名的实体,并且可以引用该名称中指定的值“属性,同时生成JPQL查询

在你的情况下,你可以

@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);

是的,你说得对,我错过了规范文件上的那部分。谢谢