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
它将获取 B
s 除非设置延迟加载。然而,仍然不能保证 B
真的很懒惰。如何遵守它取决于实施。
但是如果遵守延迟加载,查看数组索引 [1] 将不会触发 B
的加载。
也可能在没有任何 mods 的情况下,只有 memberB.id
不会触发完整加载,但它只会加载对对象的引用,因此只会加载 id
。
另一方面,对 JPQL 查询的窥视可能会触发完全加载,我不确定。
如果是关于优化,我会把这个负担留给 JPA 实现。
我的数据库中有两个 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
它将获取 B
s 除非设置延迟加载。然而,仍然不能保证 B
真的很懒惰。如何遵守它取决于实施。
但是如果遵守延迟加载,查看数组索引 [1] 将不会触发 B
的加载。
也可能在没有任何 mods 的情况下,只有 memberB.id
不会触发完整加载,但它只会加载对对象的引用,因此只会加载 id
。
另一方面,对 JPQL 查询的窥视可能会触发完全加载,我不确定。
如果是关于优化,我会把这个负担留给 JPA 实现。