Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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
Postgresql Hibernate进行了太多的查询_Postgresql_Hibernate_Spring Boot_Orm_Jhipster - Fatal编程技术网

Postgresql Hibernate进行了太多的查询

Postgresql Hibernate进行了太多的查询,postgresql,hibernate,spring-boot,orm,jhipster,Postgresql,Hibernate,Spring Boot,Orm,Jhipster,我的申请中有一个性能问题 我有三个实体,其关系如下: one Order => many OrderLines => Many Cards 从数据库加载实体花费了太多的时间,订单行加载的是急加载,而卡片加载的是延迟加载。延迟加载是让应用程序流畅的必要条件 我需要为一个案例配置渴望加载,我需要帮助来完成它 我正在使用jhsipster stack:spring boot和JPA 我试图编写Hql查询 @Query(value = "from Order as order "

我的申请中有一个性能问题

我有三个实体,其关系如下:

one Order => many OrderLines => Many Cards
从数据库加载实体花费了太多的时间,订单行加载的是急加载,而卡片加载的是延迟加载。延迟加载是让应用程序流畅的必要条件

我需要为一个案例配置渴望加载,我需要帮助来完成它

我正在使用jhsipster stack:spring boot和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);
我有un错误:意外的令牌订单(第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;
}
公共类顺序实现可序列化{
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JoinColumn(name=“order\u id”,null=false)
@尺寸(最小值=1)
@缓存(用法=缓存并发策略。非严格读写)
@JsonProperty(“详细信息”)
@有效的
private List orderLines=new ArrayList();
}
公共类OrderLine扩展了AbstractAuditionEntity,实现了可序列化、可比较的{
@独身癖
@JoinColumn(name=“orderline\u id”)
@杰索尼奥雷
@缓存(用法=缓存并发策略。非严格读写)
私有集giftcards=newhashset();
}
公共类Giftcard扩展了AbstractAuditionEntity,实现了可序列化、可比较的{
@多通(可选=真)
@JoinColumn(name=“orderline\u id”)
@杰索尼奥雷
专用命令行命令行;
}
实际上是我的代码

{
    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
        }
    }
{
Order Order=orderRepository.findWithDependenciesNative(linkFile.getOrder());
//一些代码
List orderLines=order.getOrderLines();
排序(Comparator.comparing(OrderLine::getId));
for(订单行订单行:订单行){
流卡=orderLine.getCards().Stream().sorted(Comparator.comparing(Card::getCardNumber));
for(Card:cards.collect(Collectors.toList())){
//一些代码
}
}
问题是在第二个foreach中,对于hibernate中的每一张卡,执行两个查询,带有join的请求不会像eager配置那样加载数据。您有什么想法可以帮助我吗

非常感谢

使用“加入fetch”以避免延迟加载。 “fetch”联接允许使用单个select将值的关联或集合与其父对象一起初始化。这在集合的情况下特别有用。它有效地覆盖关联和集合的映射文件的外部联接和惰性声明。 请参阅有关联接获取的更多信息:


在您的第一个查询中,请使用其他内容,如
order
:order
,因为这显然是一个sql关键字,这就是为什么hibernate会显示错误。Join fetch解决了第一个问题。现在我只有一个查询。第二个问题:“意外的令牌顺序”是因为“order”是postgre的关键词。现在我的单元测试有了新的问题:org.hibernate.LazyInitializationException:无法初始化代理-没有会话您知道这个问题吗?使用backticks(```),在列名周围加引号或双引号。例如:
order
我在另一个主题上找到了一个解决方案。我在配置文件中添加了hibernate.jdbc.use\u streams\u for\u binary:false,它解决了问题。现在我希望真正理解答案。
@Query("Select order from Order as order "
        + "inner join fetch order.orderLines as orderLines "
        + "inner join fetch orderlines.cards gc "
        + "where order.id= :order")
Order findWithDependencies(@Param("order")Long order);