2

我和春天數據和Neo4j的在我的當前項目工作,有以下情況的:傳遞可選參數@Query Spring的數據存儲庫的方法

@RestController 
@RequestMapping(value = SearchResource.URI) 
public class PersonResource { 

public static final String URI = "/person"; 

@Autowired 
PersonRepository personRepository; 

@GetMapping 
public Collection<Person> findPersons(
    @RequestParam(value = "name", required = false) String name, 
    @RequestParam(value = "birthDate", required = false) Long birthDate, 
    @RequestParam(value = "town", required = false) Spring town) { 

    Collection<Person> persons; 

    if (name != null && birthDate == null && town == null) { 
     persons = personRepository.findPersonByName(name); 
    } else if (name != null && birthDate != null && town == null { 
     persons = personRepository.findPersonByNameAndBirthDate(name, birthDate); 
    } else if (name != null && birthDate != null && town != null { 
     persons = personRepository.findPersonByNameAndBirthDateAndTown(name, birthDate, town); 
    } else if (name == null && birthDate != null && town == null { 
     persons = findPersonByBirthDate(birthDate); 
    } else if 
     ... 
    } 
    return persons; 
} 
} 

你或許已經可以看到我的問題:鏈條如果其他塊。每次我添加一個新的過濾器來搜索人員時,我必須添加新的可選參數,將所有if-else-blocks加倍,並將新的find-Methods添加到我的PersonRepository中。所有find-Methods都使用Spring @Query註釋進行註釋,並獲取自定義密碼查詢以獲取數據。

是否有可能以更優雅的方式實現此功能? Spring Data在這種情況下是否提供任何支持?

+1

爲您的存儲庫定義自定義方法(https://docs.spring.io/spring-data/neo4j/docs/4.2.6.RELEASE/reference/html/#repositories.single-repository-behaviour)。在方法實現中,根據搜索條件動態生成查詢並執行它。 –

+0

您可以嘗試使用此方法https://stackoverflow.com/a/44705452 – Cepr0

回答

1

我使用QueryData和Spring Data解決了這個問題。 在baeldung.com上有一個很好的教程。 使用QueryDSL,您的彈簧數據查詢僅爲personRepository.findAll(predicate);

可以使用一個對象來表示所述多個請求參數和聲明其類型爲Optional<String> name;

然後可以構建謂詞(假設你設置你的東西作爲在鏈接教程):

Predicate predicate = new MyPredicateBuilder().with("name", ":", name.orElse("")) 
.with("birthDate", ":", birthDate.orElse("")) 
.with("town", ":", town.orElse("")) 
.build(); 

我個人對它進行了修改,因此它沒有使用「:」,因爲它們對於我的用法是多餘的。

+1

Hello @AllanT!這對我來說似乎是一個完美的解決方案。不幸的是,Spring Data Neo4J似乎不贊成在當前版本中支持QueryDslPredicateExecutor –

相關問題