JPA - 仅选择没有引用对象的外键

时间:2017-10-28 11:26:08

标签: jpa foreign-keys javadb

我的数据库中有两个表。表A在表B的主键上有一个外键引用。在java中,这导致实体类A具有实体B的类成员。 现在我想做一个简单的

SELECT * FROM A

使用JPA我现在有以下代码来实现:

CriteriaQuery cq;
EntityManager em;
...

cq.select(cq.from(A.class));
List<A<> result = em.createQuery(cq).getResultList();

这正是我不想要的。而不是获取包含外键对象B的类型A的对象,我只想要B的外键而不是整个对象。所以最后我有一个对象列表,它只包含A的原始数据类型加上B的外键。

1 个答案:

答案 0 :(得分:0)

结果类型应该是您获取的内容,假设它是Long

TypedQuery<Long> tq;

JPQL中的查询允许您引用像

这样的实体成员
tq = em.createQuery(" SELECT a.memberB.id FROM A a ", Long.class);

其中memberB是保存B

实例的成员字段的名称

但让A只有memberB.id它有点棘手。

我现在假设你不想触摸A,就像添加任何字段一样。一种选择是使memberB加载延迟并执行以下操作。

TypedQuery<Object[]> tq =
   em.createQuery(" SELECT A, a.memberB.id FROM A", Object[].class);        
List<Object[]> longs = tq.getResultList(); // so array having pairs A,memberB.id

然后在SO中还有一些示例需要A的额外字段来保存B的ID。

如上所述,这个解决方案还存在一个问题,即如果你考虑性能/内存是因为你问这个问题。

如果你想获取A,它将获取B,除非设置加载延迟。然而,仍然不能保证B真的是懒惰。实现如何遵守它。

但是如果延迟加载是obeyd,则查看数组索引[1]将不会触发B的加载。

也可以没有任何mods偷看只有memberB.id不会触发满载,但它只加载对象的引用,所以只加载id

另一方面,可能已经看到JPQL查询已经触发满载,我不确定。

如果是关于优化的话,我会把这个负担留给JPA实施。