如何在 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 创建投影后您无法设置它,但由于您只需要格式化,因此无需设置任何东西 - 默认方法就可以了。