我已經實作了 Hibernate Search,目前遇到了 Projection 的問題。所有相關資料都已編入索引,因此我嘗試將它們投影到 DTO。作為檔案(https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#search-dsl-projection-composite),我嘗試了以下
searchSession.search(Building.class)
.select(f -> f.composite(BuildingDto::new,
f.field("id", String.class),
f.field("name", String.class),
f.field("street", String.class),
f.field("zip", String.class),
f.field("town", String.class)))
.where(f -> f.wildcard().fields("id", "name", "town", "street", "zip").matching(search))
.sort(f -> f.field("id").desc())
.fetch(20);
在運行構建時,我收到以下錯誤訊息:
java: method composite in interface org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory<R,E> cannot be applied to given types;
required: org.hibernate.search.engine.search.projection.dsl.ProjectionFinalStep<?>[]
found: BuildingDto::new,org.hibernate.search.engine.search.projection.dsl.FieldProjectionValueStep<capture#1 of ?,java.lang.String>,org.hibernate.search.engine.search.projection.dsl.FieldProjectionValueStep<capture#2 of ?,java.lang.String>,org.hibernate.search.engine.search.projection.dsl.FieldProjectionValueStep<capture#3 of ?,java.lang.String>,org.hibernate.search.engine.search.projection.dsl.FieldProjectionValueStep<capture#4 of ?,java.lang.String>,org.hibernate.search.engine.search.projection.dsl.FieldProjectionValueStep<capture#5 of ?,java.lang.String>
reason: varargs mismatch; bad return type in method reference
BuildingDto cannot be converted to org.hibernate.search.engine.search.projection.SearchProjection<java.lang.Object>
BuildingDto 具有以下建構式:
public BuildingDto (){}
public BuildingDto (String id, String name,String street, String zip, String town) {
//setting vars
}
uj5u.com熱心網友回復:
如參考檔案中所述,型別安全復合投影目前僅支持最多三個內部投影。
如果您需要更多,創建 DTO 的“轉換器”函式將需要接受 aList<?>并執行一些強制轉換:
searchSession.search(Building.class)
.select(f -> f.composite(list -> new BuildingDto(
(String) list.get(0),
(String) list.get(1),
(String) list.get(2),
(String) list.get(3),
(String) list.get(4)
),
f.field("id", String.class),
f.field("name", String.class),
f.field("street", String.class),
f.field("zip", String.class),
f.field("town", String.class)))
.where(f -> f.wildcard().fields("id", "name", "town", "street", "zip").matching(search))
.sort(f -> f.field("id").desc())
.fetch(20);
是的,這很難看,但我們正在研究更好的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/462576.html
上一篇:使用彈簧創建自定義查找器
