我的 Java (Spring Boot) 應用程式中有以下投影:
public interface DemoProjection {
UUID getUuid();
String getName();
String getSurname();
String getLabel();
void setLabel(String label);
我想label在我的服務中設定這個欄位:
public DemoProjection findAByUuid(UUID uuid) {
// returns a single record
final DemoProjection demo = demoRepository.findAByUuid(uuid);
final String label = String.format(
"Name: %s%nSurnamame Surname: %s",
demo.geteName(),
demo.getSurname());
// ! this line throws error
demo.setLabel(label);
return demo;
}
demo.setLabel(label);拋出錯誤:“無法設定投影無法修改 TupleBackedMap。”
那么,如何label在投影中設定欄位?
uj5u.com熱心網友回復:
你實際上不能那樣做。Spring Data 使用代理和 AOP 將查詢結果系結到您的投影介面,并且由于它是一個介面,您無法以神奇的方式更改它。我建議創建一個模型/dto 并在那里映射您的投影值:
public class DemoDto {
private String uuid;
private String name;
private String surname;
//getters and setters ommited for brevity
}
您可以使用所需的值創建 DemoDto 物件。
或者,您可以使用投影類而不是投影介面。檢查彈簧檔案如何做到這一點:)
uj5u.com熱心網友回復:
只需在您的 DemoProjection 介面中創建一個默認方法,即可按照您的意愿回傳格式化的 getLabel:
public interface DemoProjection {
UUID getUuid();
String getName();
String getSurname();
default String getLabel() {
return String.format(
"Name: %s%nSurnamame Surname: %s",
geteName(),
getSurname());
}
}
這是必需的,因為您無法在由 JPA 創建后設定投影,但由于您只需要格式化,因此無需設定任何內容 - 默認方法即可解決問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/390082.html
