Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何有效地使用准备好的报表?_Java_Jpa_Prepared Statement - Fatal编程技术网

Java 如何有效地使用准备好的报表?

Java 如何有效地使用准备好的报表?,java,jpa,prepared-statement,Java,Jpa,Prepared Statement,我喜欢使用DAO模式,并有一个类来完成对特定表和JPA实体的所有SQL请求。例如,我有这样一个例子: public class MyDao { @PersistenceContext(name = "mycontext") private EntityManager entityManager; public List<MyEntity> find(String code) { return getEntityManager()

我喜欢使用DAO模式,并有一个类来完成对特定表和JPA实体的所有SQL请求。例如,我有这样一个例子:

public class MyDao {

    @PersistenceContext(name = "mycontext")
    private EntityManager entityManager;

    public List<MyEntity> find(String code)  {

        return getEntityManager()
            .createQuery("FROM MyEntity e WHERE e.code = :code")
            .setParameter("code", code)
            .getResultList();

    }

}
公共类MyDao{
@PersistenceContext(name=“mycontext”)
私人实体管理者实体管理者;
公共列表查找(字符串代码){
返回getEntityManager()
.createQuery(“来自MyEntity e,其中e.code=:code”)
.setParameter(“代码”,代码)
.getResultList();
}
}
但我也知道,我们可以使用静态方法直接在实体类上使用命名查询(我不喜欢这种方式):

@实体
@桌子
@命名查询({
@NamedQuery(name=“find”,query=“FROM MyEntity e,其中e.code=:code”)
})
公共类MyEntity{
...
公共静态列表查找(EntityManager EntityManager,字符串代码){
返回entityManager.createNamedQuery(“find”,MyEntity.class)
.setParameter(“代码”,代码)
.getResultList();
}
}

其中一种方法比另一种好吗?如果我想在同一事务中执行同一个SQL查询数千次,那么这两个方法是否都保存在JPA内存(或其他地方)中准备好的语句?在这种情况下,这似乎是一种很好的做法。我认为第二种方法可以做到这一点,因为它是静态的,而不是第一种。我错了吗

通过@NamedQuery进行反向定义的查询的优点是,如果您使用JPA非hibernate特定API在persistence.xml中启用查询,它们将被预编译,可以缓存在辅助缓存中,并在启动时进行语法验证

因此,如果您计划只使用JPA执行查询,通常最好使用NamedQuery并缓存查询

因此,对于使用hibernate的JPA,您可以执行以下操作:

            @NamedQuery(name="AbstractBaseQuestion.findAllInstancesByGroupID", query="SELECT q FROM AbstractBaseQuestion q WHERE q.isTemplate = FALSE", hints={@QueryHint(name="org.hibernate.cacheable", value="true"),@QueryHint(name="org.hibernate.cacheMode", value="NORMAL"),}),
在hibernate的persistence.xml中,您可以在启动时验证这些@namedQuery:

      <property name="hibernate.hbm2ddl.auto" value="validate"/>

现在,如果使用Hibernate会话API,您建议的第一个方法可以被缓存和预编译。我想EclipseLink和其他ORM上也有类似的功能,但在这一点上,您使用的是非JPA功能,这可能会使从一个JPA实现转移到另一个JPA实现变得困难

如果您不做额外的特定于实现的工作,您的查询将不会被缓存,您将支付性能损失

我希望这会有所帮助。

JPQL开始“选择{alias}”。这部分不是可选的。JPA实现需要定义处理其内部的最有效方式,而不是用户
      <property name="hibernate.hbm2ddl.auto" value="validate"/>