[英]JPA/Hibernate Custom Queries with optional parameters
我有一個實體
@Entity
@Table(name = "EVENT")
public class Event {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
@Column(name = "EVENT", columnDefinition="VARCHAR(100)", nullable = false)
private String event;
@Column(name = "DATE", columnDefinition="DATETIME", nullable = false)
@Convert(converter = InstantConverter.class)
private Instant date;
}
還有一個SearchParams
類,其中所有字段都是可選的
public class SearchParams {
private Long id;
private Instant startDate;
private Instant endDate;
private String event;
public Optional<Long> getID() {
return Optional.ofNullable(id);
}
// ... Similar for other fields ...
}
我希望能夠像這樣進行搜索:
public List<Event> search(SearchParams searchParams) {
// Do something with Entity Manager/another hibernate class to create a custom query based off the search params.
return events;
}
在JPA中最簡單的方法是什么? 還是這不是使用正確的框架?
我總是可以求助於sql
字符串構建,但是這樣做不是一個好方法。
據記住,JPA具有方法where,該方法將謂詞數組作為參數。
因此,您可以做的是根據您的參數創建謂詞的動態列表,然后將其傳遞給查詢。
所以你的代碼將是這樣的
List<Predicate> predicates= new ArrayList<>();
if (!searchParams.getId().isEmpty()){
predicates.add(cb.equal(root.get("id"), searchParams.getId());
}
....
query.where(predicates.toArray(new Predicate[predicates.size()]));
Spring Data JPA示例查詢技術使用Example
和ExampleMatcher
將實體實例轉換為基礎查詢。 當前的官方文檔闡明了僅精確匹配可用於非字符串屬性。 由於您的要求涉及“日期”字段,因此只能與“按示例查詢”技術完全匹配。
請參閱https://stackoverflow.com/a/39555487/4939174
您也可以參考此鏈接獲取Spring Data JPA-規范和Querydsl
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.