2016-11-07 49 views
0

我有我的春天JPA数据接口里面的方法如下:春数据:多个IN的查询里面

List<TransactRepViewModel> findByClientIdInAndClDateBetween(List<String> clientIdList, Date startDate, Date endDate) 

的问题是,我得到这个错误是由于具有约5000-20000字符串我clientIdList对象中:

ORA-01795: maximum number of expressions in a list is 1000 

有没有办法在弹簧数据查询中使用多个IN并将我的列表分开以避免错误?

更新

THS是如何得到我的客户对象列表:

List<ClieTabModel> clieTabModelList = clieTabModelRepository.findByCompanyId(companyViewModel.getId()); 

这是我得到的客户端1d的名单:

List<String> clientIdList = new ArrayList <>(); 
      for (ClieTabModel clieTabModel : clieTabModelList) { 
       clientIdList.add(clieTabModel.getClientId()); 
      } 
+2

你肯定在每个查询传递5000-20000参数是一个很好的决定?在这种情况下使用子选择/连接可能会更好... – dmitrievanthony

+0

列表中有多少个元素? – developer

+0

@javaguy最少5000. –

回答

0

您可以使用以下查询:

@Query("select u from User u where u.id in :clientIds and :startDate=? and endDate= :endDate") 
List<TransactRepViewModel> findByClientIdInAndClDateBetween(Set<String> clientIds, Date startDate, Date endDate) 
0

因为我看到你的ER模型应该是这样的: Transact >--- Client >--- Company

因此,在这种情况下,你可以编写遵循查询:

List<TransactRepViewModel> findByClientCompanyIdAndClDateBetween(String companyId, Date startDate, Date endDate)

+0

这就是现在的代码,当我们获得8000个客户端的列表时,应用程序正在向数据库发出8000个查询。我不认为这是要走的路...... –

+0

这是另一个话题。为了避免JPA中的多重查询,您可以使用'FETCH JOIN'或'@ EntityGraph'。 – dmitrievanthony