当前位置: 首页 > 知识库问答 >
问题:

如何用Hibernate/JPA映射一个List而不需要额外的join表?

拓拔辰钊
2023-03-14

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

我如何构造我的POJO,这样我就可以有一个< code >列表

@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
}

这样做,我得到了一个org.postgresql.util.PSQLEx

为什么hibernate认为我想要的< code>String在另一个表中?我如何修复这种行为?我只是尝试将PostgreSQL text[]列映射回< code >列表

共有1个答案

白彦
2023-03-14

在这些情况下,方法是使用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(",")));
  }
}

并在实体字段中使用注释转换器

@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
}
 类似资料:
  • 让我们假设以下关联: 添加此附加映射后,使用时,到表的左外部联接将消失 这个解决方案在我的测试用例中有一个缺点:在用repsitory.getOne(id)(Spring Data JPA)加载实体后,实体中的属性为null。 如果我只需要使用带有的投影,或者如果我只想在where子句中使用它,如果在同一个表中,有没有更好的方法避免联接?

  • 您好,我有多对多映射,在联接表中有额外的列。表结构如下所示。 关系如下 链接 我创建了如下POJO类 Vendor.java 学生。爪哇 测试。爪哇 供应商est.java 供应商学生测试PK。爪哇 Hibernate映射文件,如下所示 vendor.hbm.xml vendor\u student\u测试。hbm。xml 大学生hbm。xml 测验hbm。xml 我刚开始Hibernate,这是

  • 问题内容: 我在为某些实体设置jpa映射时遇到麻烦。我有一个如下定义的父实体。 然后,我有一个带有复合键的子实体,以及此表的主键的外键,如下所示: 我知道子实体不正确,但是我不确定如何将其设置为具有复合PK。我知道我需要设置一个PK类,但是当一个字段是父类的外键时,我不确定该怎么做。一旦设置好,父级将如何引用子级实体? 任何帮助表示赞赏。 问题答案: 这受JPA 2规范的 第2.4.1节“与派生身

  • 问题内容: 有人可以给我一个Hibernate中单向@OneToOne主键映射的示例吗?我已经尝试了多种组合,到目前为止,我得到的最好的东西是: 每当Hibernate尝试自动为上述映射生成模式时,它都会尝试将主键创建为blob(而不是long)(即PaperCheque的id类型)。有人能帮帮我吗 ?如果我无法找到确切的解决方案,那么可以采取一些措施,但我希望得到任何答复。 问题答案: 您的意图

  • 我有一个hibernate查询,如下所示 但是这个查询不起作用 错误:连接需要路径!错误:连接需要路径!加入所需的路径!在org.hibernate.hql.internal.ast.hqlsqlwalker.createFromJoinElement(HQLSQLWalker.java:385)在org.hibernate.hql.internal.antlr.hqlsqlBaseWalker.