Hibernate需要很长时间才能获得查询结果

时间:2019-01-10 16:50:47

标签: java hibernate spring-data-jpa

每当我查询一个让Spring Data / Hibernate在我的代码上建立查询'findByLabelAndUserId'的表时,它似乎总是要花很多时间。

我在sql服务器上测试了查询,它立即返回了结果。

当我在项目上测试查询时,花了4秒钟以上的时间才能获取10行。

这是我想做的事情: 使用@Query,但是更改许多方法将花费很长时间。 我添加了一个全参数构造函数,但没有任何改变。 我将获取方法从渴望更改为懒惰,但没有任何改变

我试图在jdbc url中设置此属性:sendStringParametersAsUnicode = false

将时间减少0.5秒,但这还不够。

这是我的代码:LeaveController:

@RequestMapping(value = "/leaves-management/leaves", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("hasAuthority('view_MY_LEAVE')")
public List<LeaveDto> getAllByUser(HttpServletRequest httpRequest) {
    String token = httpRequest.getHeader(tokenHeader);
    String username = jwtTokenUtil.getUsernameFromToken(token);
    User user = userService.findByUsername(username);
    List<Request> listRequests = requestService.findByLabelAndUserId(LabelRequest.LEAVE, user.getId());
    return listModelToListDtoWithStatus(listRequests);
}

实体部分:

public class Request extends AbstractAuditEntity {

    @Column(nullable = false)
        @Enumerated(EnumType.STRING)
        private LabelRequest label;

        @Column(nullable = false)
        @Enumerated(EnumType.STRING)
        private Status status;

        @ManyToOne(fetch = FetchType.LAZY)
        private User user;
    }

如何减少使用spring数据/休眠状态的查询时间。

2 个答案:

答案 0 :(得分:0)

尝试直接在userService接口内部添加JPQL查询。这样,您将使用此查询,而不是spring会生成的查询。

@Query("SELECT r FROM Request r WHERE r.label = label AND r.user = user")
Collection<Request> findByLabelAndUserId(@Param("label") Label label, @Param("user") User user);

如果这不起作用,请在userService接口内再次尝试直接进行本机查询。

@Query("SELECT r FROM Table_Request r WHERE r.Column_label = label AND r.Column_user = user",  nativeQuery = true)
Collection<Request> findByLabelAndUserId(@Param("label") Label label, @Param("user") User user);

尽管如此,为什么spring数据执行的查询效率如此低下却很奇怪。如果查询是如此简单,请记住,问题可能出在应用程序的其他地方。

祝你好运!

答案 1 :(得分:0)

听起来像是典型的“左连接提取”问题。检查执行的有效查询是什么

相关问题