Jakarta ee 从实体类创建JPA1抽象类findAll方法

Jakarta ee 从实体类创建JPA1抽象类findAll方法,jakarta-ee,jpa,ejb,Jakarta Ee,Jpa,Ejb,在抽象类中使用EntityManager,我试图创建一个函数,该函数返回一个表中来自entity类的所有结果的列表。每个表都有自己的从抽象类继承的持久性类。到目前为止,我已经: public abstract class AbstractFacade<T> { private Class<T> entityClass; ... public List<T> findAll() { javax.persistence.

在抽象类中使用
EntityManager
,我试图创建一个函数,该函数返回一个表中来自entity类的所有结果的列表。每个表都有自己的从抽象类继承的持久性类。到目前为止,我已经:

public abstract class AbstractFacade<T> {
    private Class<T> entityClass;

    ...

    public List<T> findAll() {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        return getEntityManager().createQuery(cq).getResultList();
    }
}
公共抽象类AbstractFacade{
私有类实体类;
...
公共列表findAll(){
javax.persistence.CriteriaQuery cq=getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
返回getEntityManager().createQuery(cq.getResultList();
}
}
这适用于JPA2.0,但我刚刚发现我的服务器仅限于JPA1.0,它不支持
getCriteriaBuilder()
createQuery(CriteriaQuery cq)


有没有一种方法可以通过JPA 1.0中存在的机制重新分解代码,从而完成相对相同的任务?

您可以使用以下方法:

public List<T> findAll() {
    return (List<T>) getEntityManager().createQuery(
        "select e from " + entityClass.getSimpleName() + " e")
        .getResultList();
}
公共列表findAll(){
返回(列表)getEntityManager().createQuery(
从“+entityClass.getSimpleName()+“e”中选择e”
.getResultList();
}

请注意,如果覆盖逻辑实体名称(
@entity(name=…)
),它将不起作用,但这在实践中并不常见。

您可以使用以下方法:

public List<T> findAll() {
    return (List<T>) getEntityManager().createQuery(
        "select e from " + entityClass.getSimpleName() + " e")
        .getResultList();
}
公共列表findAll(){
返回(列表)getEntityManager().createQuery(
从“+entityClass.getSimpleName()+“e”中选择e”
.getResultList();
}

请注意,如果覆盖逻辑实体名称(
@entity(name=…)
),它将不起作用,但这在实践中并不常见。

谢谢。它们的语法是有效的,但是如果我试图计算行数,这是什么样子的呢?我是否可以将
COUNT(*)
添加到第一个
e
前面,如
select COUNT(*)e from NHDDEVL.CANDIDATE e
?@itslittlejohn:您应该在
COUNT
子句中使用别名本身:
select COUNT(e)from。。。e
再次感谢。我不熟悉JPA,请原谅我的无知,但是如果我手动测试DB2数据库的查询,它似乎不起作用:
从NHDDEVL.CANDIDATE e中选择COUNT(e)
。它只能通过JPA工作吗?DB2(或一般的数据库)根本不知道JPQL查询。JPQL是特定于JPA的查询语言。JPQL查询由您的JPA提供程序(例如Hibernate)转换为SQL,SQL通过JDBC驱动程序对数据库执行。谢谢。它们的语法是有效的,但是如果我试图计算行数,这是什么样子的呢?我是否可以将
COUNT(*)
添加到第一个
e
前面,如
select COUNT(*)e from NHDDEVL.CANDIDATE e
?@itslittlejohn:您应该在
COUNT
子句中使用别名本身:
select COUNT(e)from。。。e
再次感谢。我不熟悉JPA,请原谅我的无知,但是如果我手动测试DB2数据库的查询,它似乎不起作用:
从NHDDEVL.CANDIDATE e中选择COUNT(e)
。它只能通过JPA工作吗?DB2(或一般的数据库)根本不知道JPQL查询。JPQL是特定于JPA的查询语言。JPQL查询由您的JPA提供程序(例如Hibernate)转换为SQL,SQL通过JDBC驱动程序针对数据库执行。