Спецификация Spring Data JPA, оператор изменения критериев с равного на аналогичный - PullRequest
0 голосов
/ 15 января 2019

Я должен изменить запрос SQL, вызванный HTTP-запросом из этого:

SELECT * FROM inventory WHERE interface = 'Ethernet'

к этому

SELECT * FROM inventory WHERE interface LIKE '%Ethernet%'

Метод Resource, обрабатывающий HTTP-запрос, выглядит так:

// InventoryResource.java
@GetMapping("/inventories")
@Timed
public ResponseEntity<List<Inventory>> getAllInventories(InventoryCriteria criteria) {
    List<Inventory> page = inventoryQueryService.findByCriteria(criteria);    
    return new ResponseEntity<>(page, HttpStatus.OK);
}

Служба запросов

// inventoryQueryService.java
@Transactional(readOnly = true)
public List<Inventory> findByCriteria(InventoryCriteria criteria) {
    final Specifications<Inventory> specification = createSpecification(criteria);
    return inventoryRepository.findAll(specification);
}

Затем есть построитель критериев:

private Specifications<Inventory> createSpecification(InventoryCriteria criteria) {
    Specifications<Inventory> specification = Specifications.where(null);    
    // ....        
    if (criteria != null) {
        specification = specification.and(buildStringSpecification(criteria.getInterfaceType(), Inventory_.interfaceType));
    }        
    // ....   
    return specification;    
}

Поля и методы для построения запроса определены здесь:

public class InventoryCriteria implements Serializable {

    private static final long serialVersionUID = 1L;

    private LongFilter index;    
    // ...    
    private StringFilter interfaceType;   
    // ...   
    // ...    
    public StringFilter getInterfaceType() {
        return interfaceType;
    }   
    // ...

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("InventoryCriteria [index=");
        builder.append(index); 
        // ...    
        builder.append(", interfaceType=");
        builder.append(interfaceType);    
        // ...    
        builder.append("]");
        return builder.toString();        
    }    
}

Итак, я полагаю, что эта строка: specification = specification.and(buildStringSpecification(criteria.getInterfaceType(), Inventory_.interfaceType));

следует изменить. Но непонятно как.

...