如何从持久性单元获取所有托管类型的列表

时间:2013-10-30 08:08:42

标签: hibernate java-ee jpa

输入: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;
}

的persistence.xml:

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

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

输出:

puplic List<List<Object> GetAllObjects();

我发现here我可以使用metamodel

解决我的问题

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

我收到Set后如何从DB foreach EntityType获取所有对象?

1 个答案:

答案 0 :(得分:1)

EntityManager作为em和当前实体类(在迭代所有实体类的集合时)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()将收到一个对象列表 - 它不知道正确的类型。您可以通过添加以下内容来丰富此示例:将接收正确类型列表的接口,但这是原则。