Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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

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
Hibernate 提高JPA的性能_Hibernate_Jpa - Fatal编程技术网

Hibernate 提高JPA的性能

Hibernate 提高JPA的性能,hibernate,jpa,Hibernate,Jpa,我正在尝试改进以下代码,以消除任何潜在的瓶颈: public List<PostDTO> getOrderDetails(int pageNumber) { List<Order> orders = entityManager .createQuery(“SELECT o FROM Order o”) .setFirstResult((pageNumber - 1) * 20) .setMax

我正在尝试改进以下代码,以消除任何潜在的瓶颈:

public List<PostDTO> getOrderDetails(int pageNumber) {
    List<Order> orders = entityManager
            .createQuery(“SELECT o FROM Order o”)
            .setFirstResult((pageNumber - 1) * 20)
            .setMaxResults(20)
            .getResultList();
    List<OrderDTO> result = new ArrayList(orders.size());

    for(Order order : orders) {
        OrderDTO orderDto = new OrderDTO();
        orderDto.setId(order.getId());
        orderDto.setTitle(order.getDate());
        orderDto.setTopicName(order.getDetail().getProductId());
        result.add(orderDto);
    }

    return result;
}
public List getOrderDetails(int页码){
列表顺序=entityManager
.createQuery(“从订单o中选择o”)
.setFirstResult((页码-1)*20)
.setMaxResults(20)
.getResultList();
列表结果=新的ArrayList(orders.size());
对于(订单:订单){
OrderDTO OrderDTO=新OrderDTO();
orderDto.setId(order.getId());
orderDto.setTitle(order.getDate());
orderDto.setTopicName(order.getDetail().getProductId());
结果.添加(orderDto);
}
返回结果;
}
根据以下线程:,可能存在N+1 select问题,因此我使用以下方式进行连接获取:

    List<Order> orders = entityManager
            .createQuery(“SELECT o FROM Order o join fetch o.detail”)
            .setFirstResult((pageNumber - 1) * 20)
            .setMaxResults(20)
            .getResultList();
    List<OrderDTO> result = new ArrayList(orders.size());
List orders=entityManager
.createQuery(“从订单中选择o,加入获取o.detail”)
.setFirstResult((页码-1)*20)
.setMaxResults(20)
.getResultList();
列表结果=新的ArrayList(orders.size());

这是一个好的进步吗?有没有其他方法可以改进我使用JPQL查询的方式?

还有更好的方法。只需选择实际需要的属性/列

我认为这是一个完美的用例

我创建了这个库,以便在JPA模型和自定义接口或抽象类定义的模型之间进行简单的映射,类似于类固醇上的Spring数据投影。其思想是以您喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(getter)映射到实体模型

在Blaze持久性实体视图中,您的用例的DTO模型可能如下所示:

@EntityView(Order.class)
public interface OrderDTO {
    @IdMapping
    Long getId();
    Date getDate();
    @Mapping("detail.productId")
    Integer getProductId();
}
查询是将实体视图应用于查询的问题,最简单的就是按id进行查询

OrderDTO a=entityViewManager.find(entityManager,OrderDTO.class,id)

Spring数据集成允许您像使用Spring数据投影一样使用它:

Page findAll(可分页);

最好的是,它只会获取实际需要的状态

看起来不错;最好的方法是运行它,命令Hibernate记录实际的SQL查询,如果仍然有疑问,则测试代码的性能。超过1:M的Join fetch意味着在fetch中返回的行数增加了M倍。它的性能完全取决于返回的数据——Order表中一个巨大的clob被返回M次,这可能比仅仅发出20个额外的查询来查询主页之外的细节要糟糕得多。您需要进行测试和实验,找出最适合您使用的方法。
Page<OrderDTO> findAll(Pageable pageable);