我正在使用 JPA Criteria 在 NVARCHAR 列上運行類似查詢。列(事件)最多可容納(2000)個字符。現在這是查詢:
if (Objects.nonNull(eventStatus)) {
String eStat = "\"event_status\"";
String val ="\"" eventStatus "\"";
predicates.add(cb.like(item.get("events").as(String.class), "%" eStat "%" " " val "%"));
}
現在這不會產生預期的結果,當我看到查詢日志時,我看到了:
Hibernate:
select
count(itemadditi0_.item_additional_info_id) as col_0_0_
from
Allocation.item_additional_info itemadditi0_
where
itemadditi0_.tenant_id=?
and (
cast(itemadditi0_.events as varchar(255)) like ?
)
所以我想我沒有得到結果,因為這條線:cast(itemadditi0_.events as varchar(255)) like ?
在 SSMS 中,這個查詢作業得很好:
(select item_nbr,item_status,events from Allocation.item_additional_info where events like '%"event_status"%"Past"%');
在模型中,我們將事件保存如下
@Column(name="events",columnDefinition="nvarchar")
@Convert(converter = EventConverterJson.class)
private List<EventInfo> events;
那么你能幫我解決在這種情況下如何解決問題嗎?或者如何阻止 JPA Criteria 進行該鑄造?
uj5u.com熱心網友回復:
為什么要將物件投射到String?
這應該可以正常作業:
// Example: '%event_status% Past%'
final String likePattern = "%" eStat "%" val " " "%";
predicates.add(cb.like(item.get("events"), likePattern));
假設item是型別Root<...>。
此外,您用于 like 謂詞的模式與您顯示為作業的模式不同(它包含一個空格并且不會包含")。如果你想生成那個精確的模式,你可以這樣做:
// Example: '%"event_status"%"Past"%'
final String likePattern = "%\"" eStat "\"%\"" val "\"%";
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/524842.html
下一篇:深入理解 virtual 關鍵字
