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