2

我正在学习 EJB,JPA 并且有非常基本的疑问

我有 3 张桌子 A、B、C

A - ID,姓名

B - ID、姓名

C - ID、A_ID、B_ID

当我从数据库创建实体类时,我得到了 3 个带有 JPA 内容的 EJB 类。

现在在我的托管 bean 中,我得到 A.Name 或 B.Name,我需要使用 C 找到匹配的条目。

普通 SQL 查询看起来像(可能不是最好的查询)

SELECT a.name FROM schema.A a, schema.B b, schema.C c 其中 b.Name='ABC' and c.B_ID=b.ID and a.ID = c.A_ID;

现在我在哪里可以在我的课程中进行上述查询。

我遇到了@SecondaryTable,但不明白它是如何使用的。

我还看到了 em.createQuery(SQL query).getResultList()。

现在是上面最好的方法,或者 EJB/JPA 中是否有更好的方法。

更新 1:

我试图在 em.CreateQuery 中执行查询

em.CreateQuery(SELECT a.name FROM A a, B b, C c where b.Name='ABC' and c.B_ID=b.ID and a.ID = c.A_ID).getResultList();

但我的 GlassFish Server 出现以下错误(我正在使用 EcipeLink JPA)

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
  Position: 
Error Code: 0
Call: SELECT t0.given_name FROM test.a t3, test.a_b t2, test.b t1, test.a t0 WHERE ((((t1.Name = ?) AND (t2.b_id = t1.id.t1.id)) AND (t0.id = )) AND (t3.id = t2.a_id))
bind => [1 parameter bound]
Query: ReportQuery(referenceClass=Consultant sql="SELECT t0.given_name FROM test.a t3, test.a_b t2, test.b t1, test.a t0 WHERE ((((t1.Name = ?) AND (t2.b_id = t1.id.t1.id)) AND (t0.id = )) AND (t3.id = t2.a_id))")

现在为什么 SQl 语句在错误日志中被弄乱了

1.有一个额外的入学测试。a t0

2.t2.b_id = t1.id.t1.id

3.t0.id=

错误日志 SQL 语句是如何生成的。

4

1 回答 1

1

由于 C 是 A 和 B 之间的多对多关系,因此它不应该是一个实体。但是,我认为 JPA 不喜欢您的连接表 (C) 有它自己的 ID 列。如果可能,从 C 中删除 ID 列,并将 A_ID、B_ID 的组合作为主键。

那么实体类 A 可以有:

@JoinTable(name = "C",
    joinColumns = { @JoinColumn(name = "A_ID", referencedColumnName = "ID") },
    inverseJoinColumns = { @JoinColumn(name = "B_ID", referencedColumnName = "ID") })
@ManyToMany
private Collection<B> bCollection;

我认为所有这些注释的含义很清楚。B类将有:

@ManyToMany(mappedBy = "bCollection") 
private Collection<A> aCollection;

mappedBy 属性告诉 JPA 使用 A::bCollection 的 JoinTable 定义(A 是从字段的类型 Collection<A> 推导出来的)。

现在,如果您有 A 的实例,则可以通过获取属性轻松获取该 A 的所有 B。不需要任何 SQL/JPQL。

现在关于执行查询,您应该知道您有 JPQL 和 SQL。JPQL 是 Java 持久性查询语言,是 JPA 的语言。SQL 是数据库的母语。要执行 SQL,您需要使用 createNativeQuery 系列函数。createQuery 函数用于 JPQL。

您应该更喜欢 JPQL 而不是 SQL。两者之间最重要的区别是 JPQL 在您的实体上工作,并期望所有标识符对应于您的类和属性所使用的名称。例如,如果 Name 列(第一个大写字母)映射到名为 name(小写)的属性,那么在 JPQL 查询中您应该使用 name(小写)。实体类名称和相应的表名称相同。JPQL 还内置了对多对多关系连接表的支持,JPQL 查询你想要什么

SELECT a
FROM B b JOIN b.aCollection a
WHERE b.name='ABC'

无需指定 JPA 从类的注释中知道的所有连接条件。

@SecondaryTable 在这里不相关,它用于将单个实体拆分为多个表时使用。

于 2012-08-19T06:23:56.687 回答