我在模块中有以下实体
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>
答案 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);