簡體   English   中英

在JOOQ中動態構建條件

[英]Dynamically building conditions in JOOQ

我有一個端點,該端點接收一個包含所有列和它們要作為過濾依據的值的字符串。 這是過濾器參數的示例: ?filter=active=true,type=ADMIN ,基本上每個過濾器都用a分隔,然后列名和過濾器值用=分隔,所以我使此方法動態使用任何表的所有不同過濾器構建條件語句:

public Condition mapFilterToCondition(String tableName, String filters) {
    Condition condition = DSL.trueCondition();
    String[] filterFields = filters.split(",");
    Table<?> table = PUBLIC.getTable(tableName);
    Field<?>[] fields = table.fields();
    for(String filterField : filterFields) {
        String[] filter = filterField.split("=");
        for(Field<?> field : fields) {
            String fieldName = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, filter[0]);
            if(field.getName().equals(fieldName)) {
                if(field.getType() == String.class) {
                    condition.and(table.field(field).like(filter[1]));
                } else if (Boolean.valueOf(filter[1])) {
                    condition.and(table.field(field).isTrue());
                } else if (!Boolean.valueOf(filter[1])) {
                    condition.and(table.field(field).isFalse());
                }
            }
        }
    }
    return condition;
}

然后,我使用此方法構建的條件來調用發出sql請求的存儲庫:

public List<UserAccount> findAllByFilter(Condition condition, Pageable pageable) {
    return dsl.select()
            .from(USER_ACCOUNT)
            .where(condition)
            .limit(pageable.getPageSize())
            .offset((int) pageable.getOffset())
            .fetchInto(UserAccount.class);
}

據我了解,該條件應具有以下內容:

.where(USER_ACCOUNT.TYPE.like("ADMIN")) .where(USER_ACCOUNT.ACTIVE.isTrue())

根據我建立的條件,但是每當我打電話時,它都會返回每個用戶,而不考慮過濾器。 在調試時,我發現條件永遠不會從1 = 1更改,這是它從DSL.trueCondition();獲得的值DSL.trueCondition(); ,所以我的問題是我應該如何處理這種情況? 我是否使用condition.and(...)錯誤,還是應該使用其他東西?

任何幫助表示贊賞!

編輯

@GetMapping(value = "/admin", produces = "application/json")
public ResponseEntity listAll(String filters, Pageable pageable) {
    Condition condition = filterMapService.mapFilterToCondition("user_account", filters);
    List<UserAccount> adminAccounts = userAccountRepository.findAllByFilter(condition, pageable);
    if (adminAccounts.isEmpty()) {
        return new ResponseEntity(HttpStatus.NO_CONTENT);
    }
    List<AdminDTO> accounts = adminAccounts.stream()
            .map(account -> modelMapper.map(account, AdminDTO.class)).collect(Collectors.toList());
    return new ResponseEntity<>(accounts, HttpStatus.OK);
}

將所有引用更改為

condition.and(...)

至:

condition = condition.and(...)

Condition對象的值實際上並沒有得到更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM