如何使用 Hibernate/JPA 映射 List<String> 而无需额外的连接表?

hee*_*eez 6 java hibernate jpa

我问的问题很简单,但似乎不可能找到答案。我正在使用 Spring Data JPA,并且有一个 JDBC/JPA DataSource(这是 PostgreSQL,但这并不重要),它预加载了数据,我只是尝试从中读取数据。

如何构建 POJO 以便拥有List<String>不需要额外连接表的字段?这是我的一个示例实体类:

@Entity
@Table(name = "pojo", schema = "pojoschema")
public class POJO {
  @Id
  @Column(name = "id", columnDefinition = "uuid")
  private String id;

  @Column(name = "a_string", columnDefinition = "text")
  private String aString;

  @Column(name = "strings", columnDefinition = "text[]")
  @ElementCollection
  private List<String> strings;

  // getters/setters
}
Run Code Online (Sandbox Code Playgroud)

这样做我得到一个org.postgresql.util.PSQLException: ERROR: relation "pojo_strings" does not exist.

为什么hibernate认为String我想要的s在另一个表中?我该如何解决这个问题?我只是想通过 JPA 将 PostgreSQLtext[]列映射回List<String>POJO 中的 a 。

NiV*_*VeR 6

这些情况下的方法是使用 jpa,AttributeConverter如下所示:

@Converter
public class StringToListConverter implements AttributeConverter<List<String>, String> {

  @Override
  public String convertToDatabaseColumn(List<String> list) {
    if(list == null) return "";
    return String.join(",", list); 
  }

  @Override
  public List<String> convertToEntityAttribute(String joined) {
    if(joined == null) return new ArrayList<>();
    return new ArrayList<>(Arrays.asList(joined.split(",")));
  }
}
Run Code Online (Sandbox Code Playgroud)

Converter并在实体字段中使用注释:

@Entity
@Table(name = "pojo", schema = "pojoschema")
public class POJO {
  @Id
  @Column(name = "id", columnDefinition = "uuid")
  private String id;

  @Column(name = "a_string", columnDefinition = "text")
  private String aString;

  @Column(name = "strings")
  @Convert(converter = StringToListConverter.class)
  private List<String> strings;

  // getters/setters
}
Run Code Online (Sandbox Code Playgroud)