回答

收藏

如何使用分页来应用分页SQL查询结果?

技术问答 技术问答 239 人阅读 | 0 人回复 | 2023-09-14

我连接了三个表SQL查询,一个表只是连接其他两个表的多对多表。Spring JDBCResultSetExtractor将ResultSet转换成我的Objects,看上去像这样:
* \$ ^) J1 ~6 O8 C( Qclass Customer    private String id;    private Set accountTypes;    ...}ResultSetExtractor如下所示:
: a9 N4 V' B+ gpublic List extractData(ResultSet rs) throws SQLException,   DataAccessException {        Map[I] clientsMap = new LinkedHashMap[I]();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;while (rs.next()) {            int id = rs.getInt("id");       add the client to the map only the first time            if (!clientsMap.containsKey(id)) {                Client client = new Client();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;        client.setId(id);                ...                clientsMap.put(id,client);              always add the account type to the existing client            Client client = clientsMap.get(id);            client.addAccountType(extractAccountTypeFrom(rs,id));          return new ArrayList(clientsMap.values());}无需分页即可正常工作。
- C7 K2 m7 O: Q, d但是,我需要分页这些结果。我通常的做法是将其添加到查询中,例如:- @2 J: O; z- y" T' l- v
SELECT ... ORDER BY name ASC LIMIT 10 OFFSET 30;但是,因为这个查询有联系,所以当我限制结果的数量时,实际上是有限的JOINED结果的数量(也就是说,由于客户出现的次数与他们拥有的账户类型相同,因此不应用LIMIT客户数量,但客户数量*2 ]7 F3 ?- c% Y5 T8 v7 F8 y5 \
accountTypes,这不是我想要的。
: }4 D+ M# t  G9 V7 P- Z( u( D我想出的唯一解决办法就是从查询中删除LIMIT(以及OFFSET,因为这也是错误的),并以编程的方式应用它们:$ j- N7 i5 S6 s, [
List allClients = jdbcTemplate.query....List result = allClients.subList(offset,offset limit);但这显然不是一个很好有效的解决方案。有没有更好的办法?
) o( L4 r- k- C1 G$ w) c                                                               
/ _' ]7 a+ v2 U  R& b    解决方案:                                                                5 x/ J5 A9 Z/ j0 i: P( o; a
                                                                写问题如何让你思考很有趣,其实对想出自己问题的解决方案很有帮助。$ s* j/ c. v, [; c. |* q
将查询的分页部分添加到我的主查询子查询中,而不是主查询本身。
7 K) Y1 W. X3 L2 G# j) q  s; V; u  D例如,不要这样做:, |3 E! j4 C9 n" p( x; r4 l
SELECT client.id,client.name ...FROM clients AS clientLEFT JOIN client_account_types AS cat ON client.id = cat.client_idFULL JOIN account_types AS at ON cat.account_type_id = at.idORDER BY client.name ASCLIMIT 10 OFFSET 30;我正在这样做:
$ }) }7 {* H# e: H& uSELECT client.id,client.name ...FROM  SELECT * FROM clients    ORDER BY name ASC    LIMIT 10 OFFSET 0) AS clientLEFT JOIN client_account_types AS cat ON client.id = cat.client_idFULL JOIN account_types AS at ON cat.account_type_id = at.id;希望这对别人也有帮助。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则