【发布时间】:2017-10-27 01:27:39
【问题描述】:
我的应用程序存在性能问题。
我有三个具有以下关系的实体:
one Order => many OrderLines => Many Cards
从数据库中加载实体需要太多时间,orderLines 是通过预先加载加载的,而 Cards 是通过延迟加载加载的。延迟加载是让应用流畅的必要条件。
我需要为一个案例配置预加载,我需要帮助。
我正在使用 jhsipster 堆栈:spring-boot with JPA
我尝试写 Hql 查询
@Query(value = "from Order as order "
+ "inner join order.orderLines as orderLines "
+ "inner join orderlines.cards gc "
+ "where order.id= :order")
Order findWithDependencies(@Param("order")Long order);
我有一个错误:意外的令牌订单(第 2 行)
我用原生查询试过了
@Query(value = "select * "+
"from order_table ot "+
"left join order_line ol ON ot.id = ol.order_id "+
"left join giftcard gc ON gc.orderline_id = ol.id "+
"where ot.id=:order", nativeQuery= true)
Order findWithDependenciesNative(@Param("order")Long order);
但是当我这样做时
orderLine.getCard()
从代码中,Hibernate 仍然执行查询以从数据库中获取数据,这导致了我的性能问题。
实体的必要代码:
public class Order implements Serializable {
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "order_id", nullable = false)
@Size(min = 1)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@JsonProperty("detail")
@Valid
private List<OrderLine> orderLines = new ArrayList<>();
}
public class OrderLine extends AbstractAuditingEntity implements Serializable, Comparable {
@OneToMany
@JoinColumn(name = "orderline_id")
@JsonIgnore
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<Giftcard> giftcards = new HashSet<>();
}
public class Giftcard extends AbstractAuditingEntity implements Serializable, Comparable {
@ManyToOne(optional = true)
@JoinColumn(name= "orderline_id")
@JsonIgnore
private OrderLine orderLine;
}
我的代码实际上
{
Order order = orderRepository.findWithDependenciesNative(linkFile.getOrder());
//Some code
List<OrderLine> orderLines = order.getOrderLines();
orderLines.sort(Comparator.comparing(OrderLine::getId));
for (OrderLine orderLine : orderLines) {
Stream<Card> cards = orderLine.getCards().stream().sorted(Comparator.comparing(Card::getCardNumber));
for (Card card : cards.collect(Collectors.toList())) {
//Some code
}
}
问题出在第二个 foreach 中,对于每个卡休眠执行两个查询,并且带有 join 的请求不会像 Eager 配置那样加载数据。你有什么想法可以帮助我吗?
非常感谢
【问题讨论】:
-
在您的第一个查询中,使用其他名称作为
order和:order,因为这显然是一个 sql 关键字,这就是为什么 hibernate 会出现错误。
标签: postgresql hibernate spring-boot orm jhipster