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

Java Hibernate需要很长时间才能获得查询结果,java,hibernate,spring-data-jpa,Java,Hibernate,Spring Data Jpa,每当我查询一个表,让Spring Data/Hibernate在我的代码上构建查询'findByLabelAndUserId',它似乎总是要花很长时间 我在sql server上测试查询,它会立即返回结果 当我在我的项目上测试查询时,它花费了4秒多的时间来获取10行 以下是我认为应该做的事情: 使用@Query,但这将花费太长时间来更改许多方法。 我添加了一个全参数构造函数,但没有任何更改。 我将fetch方法从渴望更改为懒惰,但没有任何更改 我试图在jdbc url中设置此属性:sendStr

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

我在sql server上测试查询,它会立即返回结果

当我在我的项目上测试查询时,它花费了4秒多的时间来获取10行

以下是我认为应该做的事情: 使用@Query,但这将花费太长时间来更改许多方法。 我添加了一个全参数构造函数,但没有任何更改。 我将fetch方法从渴望更改为懒惰,但没有任何更改

我试图在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);
}
如何减少使用spring data/hibernate构建查询的时间


将sendStringParametersAsUnicode=false添加到jdbc url中,将响应时间从~2000ms大幅提高到200ms。真不敢相信。非常感谢您的回答。

尝试直接在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);
@Query(“从请求r中选择r,其中r.label=label,r.user=user”)
集合findByLabelAndUserId(@Param(“标签”)标签,@Param(“用户”)用户);
如果这不起作用,请在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);
@Query(“从表\u请求r中选择r,其中r.Column\u label=label和r.Column\u user=user”,nativeQuery=true)
集合findByLabelAndUserId(@Param(“标签”)标签,@Param(“用户”)用户);
然而,很奇怪为什么spring数据进行如此低效的查询。请记住,如果查询非常简单,那么问题可能在应用程序的其他地方


祝你好运

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

我检查休眠历史记录。我注意到有些查询使用左外连接。如何禁用此行为?
@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);