关于 jpa 2.0:如何使用 JPA 2.0 从对象内的 2 个表中查询特定列?

How can I query specific columns from 2 tables inside my objects using JPA 2.0?

我正在寻找一种方法来请求特定列并使用 CriteriaBuilder 在根对象中显示外来对象。这是上下文:
我有 EntityA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Entity
@Table(name ="ENTITY_A")
public class EntityA {
    int id;
    int entityBKey;
    EntityBObject entityBObject;
    int AColumn1;
    int AColumn2;

    @Basic
    public Long getEntityBKey() {
        return entityBKey;
    }

    @ManyToOne
    @JoinColumn(name ="ENTITY_B_FK")
    public EntityBObject getProgramType() {
        return entityBObject;
    }

    @Basic
    @Column(name ="COLUMN_1")
    public String getAColumn1() {
        return AColumn1;
    }
    ...
}

然后我有实体B

1
2
3
4
5
6
public class EntityB {
    int id;
    int BColumn1;
    int BColumn2;
    ...
}

现在,我想从 EntityA 请求列 AColumn1,从 EntityB 请求列 BColumn1,同时将对象 EntityB 放在 EntityA 中。我怎样才能做到这一点?

如何修改以下内容以获取内部带有 EntityB 的部分 EntityA?

1
2
3
4
5
6
7
8
public List<EntityA> findAll() {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<EntityA> criteria = cb.createQuery(EntityA.class);
    Root<EntityA> root = criteria.from(EntityA.class);
    criteria.select(root);

    return em.createQuery(criteria).getResultList();
}

谢谢!

编辑
@Tassos Bassoukos 是的,这就是我最终要做的,但是当请求变得更加复杂时,它会变得非常混乱。例如:用他们的订单拉客户,每个订单都有项目。会有很多 java 来实现这一点,虽然它可以是自动化的,所以我的对象会自动填充。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public List<EntityA> findAll() {
    ArrayList<EntityA> result = new ArrayList<>();
    Query q = em.createQuery("select eA, eB, from EntityA eA, EntityB eB where eA.key = eB.key");

    @SuppressWarnings("unchecked")
    List<Object[]> abc = q.getResultList();
    for (Object[] array : abc) {
        EntityA eA = (EntityA) array[0];
        EntityB eB = (EntityB) array[1];
        eA.setEntityB(eB);
        result.add(pe);
    }

    return result;
}


首先,你为什么想要一个部分实体?从 OO 的angular来看,这没有意义。对此有实际的具体要求吗?

其次,您想要实体还是实体列?你可以用 CriteriaBuilder 来做这两个,但是你需要清楚 a) 你想要达到什么,b) 你为什么要达到它。

第三,还有 JOIN FETCH。