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);