JPA - Select 只有外键没有被引用的对象

JPA - Select only the foreign key without the referenced object

我的数据库中有两个 table。 Table A 在 table B 的主键上有外键引用。在 java 中,这导致实体 class A 具有实体的 class 成员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 的外键。

结果类型应该是你取的,假设是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。

有了上面提到的这个解决方案仍然存在一个问题,即如果你正在考虑 performance/memory 因为你问这个。

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

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

也可能在没有任何 mods 的情况下,只有 memberB.id 不会触发完整加载,但它只会加载对对象的引用,因此只会加载 id

另一方面,对 JPQL 查询的窥视可能会触发完全加载,我不确定。

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