0

输入:2个实体类:

@Entity
@Table(name = "Table1")
public class Table1 implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    private Integer id;


    @Column(name = "Name")
    private String name;
}

@Entity
@Table(name = "Table2")
public class Table2 implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    private Integer id;


    @Column(name = "Name")
    private String name;
}

持久性.xml:

 <class>data.Table1</class>
 <class>data.Table2</class>

我想从持久性单元中获取所有管理类型的列表。

输出:

puplic List<List<Object> GetAllObjects();

我在这里发现我可以使用解决我的问题metamodel

首先 metamodel.getEntities() 返回所有具有 @Entity 注释的实体类。它对persistence.xml一无所知。

获得 Set 后,如何从 DB foreach EntityType 中获取所有对象?

4

1 回答 1

1

拥有EntityManagerasem和当前实体类(同时迭代所有实体类的集合)entityClass

// for each entity class {
    List<?> results = findAll(em, entityClass);
    doSomethingWithResults(results, entityClass);
// }

并添加以下实用方法:

private <T> List<T> findAll(EntityManager em, Class<T> entityClass) {
    CriteriaQuery<T> cq = makeAllCriteriaQuery(em, entityClass);
    TypedQuery<T> tq = em.createQuery(cq);
    List<T> ret = tq.getResultList();
    return ret;
}
private <T> CriteriaQuery<T> makeAllCriteriaQuery(EntityManager em, Class<T> entityClass) {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<T> q = cb.createQuery(entityClass);
    Root<T> root = q.from(entityClass);
    q.select(root);
    return q;
}

缺点是您的方法doSomethingWithResults()将收到一个对象列表 - 它不知道正确的类型。您总是可以通过添加例如接收正确类型列表的接口来丰富这个示例,但这是原则。

于 2013-10-30T09:37:16.417 回答