如何在 Java 投影中设置变量?
How to set variable in Java projection?
我的 Java(Spring 引导)应用程序中有以下投影:
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
场?
你实际上不能那样做。 Spring Data 使用代理和 AOP 将查询结果绑定到您的投影界面,并且由于它是一个界面,您无法以神奇的方式更改它。我建议创建一个 model/dto 并将您的投影值映射到那里:
public class DemoDto {
private String uuid;
private String name;
private String surname;
//getters and setters ommited for brevity
}
您可以使用所需的值创建 DemoDto 对象。
或者,您可以使用投影 class 而不是投影界面。查看 spring 文档,了解如何做到这一点 :)
只需在您的 DemoProjection 界面中创建一个默认方法即可 return getLabel 格式化为您希望的格式:
public interface DemoProjection {
UUID getUuid();
String getName();
String getSurname();
default String getLabel() {
return String.format(
"Name: %s%nSurnamame Surname: %s",
geteName(),
getSurname());
}
}
这是必需的,因为在 JPA 创建投影后您无法设置它,但由于您只需要格式化,因此无需设置任何东西 - 默认方法就可以了。
我的 Java(Spring 引导)应用程序中有以下投影:
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
场?
你实际上不能那样做。 Spring Data 使用代理和 AOP 将查询结果绑定到您的投影界面,并且由于它是一个界面,您无法以神奇的方式更改它。我建议创建一个 model/dto 并将您的投影值映射到那里:
public class DemoDto {
private String uuid;
private String name;
private String surname;
//getters and setters ommited for brevity
}
您可以使用所需的值创建 DemoDto 对象。
或者,您可以使用投影 class 而不是投影界面。查看 spring 文档,了解如何做到这一点 :)
只需在您的 DemoProjection 界面中创建一个默认方法即可 return getLabel 格式化为您希望的格式:
public interface DemoProjection {
UUID getUuid();
String getName();
String getSurname();
default String getLabel() {
return String.format(
"Name: %s%nSurnamame Surname: %s",
geteName(),
getSurname());
}
}
这是必需的,因为在 JPA 创建投影后您无法设置它,但由于您只需要格式化,因此无需设置任何东西 - 默认方法就可以了。