簡體   English   中英

具有可選參數的JPA /休眠自定義查詢

[英]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示例查詢技術使用ExampleExampleMatcher將實體實例轉換為基礎查詢。 當前的官方文檔闡明了僅精確匹配可用於非字符串屬性。 由於您的要求涉及“日期”字段,因此只能與“按示例查詢”技術完全匹配。

請參閱https://stackoverflow.com/a/39555487/4939174

您也可以參考此鏈接獲取Spring Data JPA-規范和Querydsl

暫無
暫無

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

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