我的实体加载速度超慢了怎么办?
我有以下实体:
@Entity @Table(name="\"Order\"") public class Order { @Id @SequenceGenerator(name="order_id_seq", sequenceName="order_id_seq", allocationSize=1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="order_id_seq") private long id; @OneToOne private Customer customerDetails; @OneToOne private ProductDetails productDetails; @OneToOne private TransportDetails transportDetails; @OneToOne private OtherDetails otherDetails; @OneToOne private OtherDetails otherDetails2; @OneToOne private OtherDetails3 otherDetails3; private LocalDateTime dateOrderPlaced; private LocalDateTime dateOrderPaid; private Float totalPrice; @Size(max = 1000) private String orderComment; }
现在,每当我第一次运行此查询时,使用以下存储库:
public interface OrderRepository extends CrudRepository { @Transactional @Modifying @Query("UPDATE Order o SET o.totalPrice = (:price) WHERE o.id= (:id)") void updateTotalPrice(@Param("id") Long id, @Param("price") Float price); @Override List findAll(); @Override Order save(@Valid Order order); }
执行以下操作大约需要5秒钟:
public List getOrders(){ return orderDtoMapper.fromDomain(orderRepository.findAll()); }
哪里:
public List fromDomain(List orders){ return orders .stream() .map(order -> fromDomain(order)) .collect(Collectors.toList()); } public OrderDto fromDomain(Order order){ OrderDto orderDto = new OrderDto(); orderDto.setTransportDetails(transportDetailsDtoMapper.fromDomain(order.getTransportDetails())); orderDto.setTotalPrice(order.getTotalPrice()); orderDto.setDateOrderPaid(order.getDateOrderPaid()); orderDto.setDateOrderPlaced(order.getDateOrderPlaced()); orderDto.setId(order.getId()); return orderDto; }
注意
我桌上只有3个实体……
尝试在@OneToOne
注释中添加"mappedBy"
值。 Actualy,看起来你有点不对劲:
@OneToOne private OtherDetails otherDetails; @OneToOne private OtherDetails otherDetails2; @OneToOne private OtherDetails3 otherDetails3;
不知道为什么有两个类OtherDetails和一个类OtherDetails3,但看起来你应该这样做
@OneToMany(...) List otherDetails
而且,也许,你有太多的数据。 启用你的hibernate日志,并直接在你的sql(我理解的是oracle)服务器中执行查询。 可能是sql server没有足够的内存用于结果集,并且它执行写入磁盘操作。
我的问题是我在多个字段上使用@Convert
注释,这减慢了整个过程。 例如:
@Data @Entity @Table(name="\"Customer\"") public class Customer { @Id @SequenceGenerator(name="customer_id_seq", sequenceName="customer_id_seq", allocationSize=1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="customer_id_seq") private long id; private String firstName; @Convert(converter = LastNameEncryption.class) private String lastName; }