我的数据库中有两个表。表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的外键。
答案 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实施。