如何使用 SpringBoot JPA 存储 PostgreSQL jsonb?

新手上路,请多包涵

我正在开发一个迁移软件,它将使用来自 REST 服务的未知数据。

我已经考虑过使用 MongoDB,但我决定不使用它并使用 PostgreSQL。

阅读 内容后,我尝试使用 Spring JPA 在我的 SpringBoot 应用程序中实现它,但我不知道在我的实体中映射 jsonb

试过 这个 但什么都不懂!

这是我的位置:

 @Repository
@Transactional
public interface DnitRepository extends JpaRepository<Dnit, Long> {

    @Query(value = "insert into dnit(id,data) VALUES (:id,:data)", nativeQuery = true)
    void insertdata( @Param("id")Integer id,@Param("data") String data );

}

和 …

 @RestController
public class TestController {

    @Autowired
    DnitRepository dnitRepository;

    @RequestMapping(value = "/dnit", method = RequestMethod.GET)
    public String testBig() {
        dnitRepository.insertdata(2, someJsonDataAsString );
    }

}

和表格:

 CREATE TABLE public.dnit
(
    id integer NOT NULL,
    data jsonb,
    CONSTRAINT dnit_pkey PRIMARY KEY (id)
)

我怎样才能做到这一点?

注意:我不想/不需要实体来处理。我的 JSON 将始终是字符串,但我需要 jsonb 来查询数据库

原文由 Magno C 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

通过添加 Spring Data JPA 只是为了执行一个简单的插入语句,您会使事情变得过于复杂。您没有使用任何 JPA 功能。而是执行以下操作

  1. spring-boot-starter-data-jpa 替换为 spring-boot-starter-jdbc
  2. 删除你的 DnitRepository 接口
  3. 注入 JdbcTemplate 你在哪里注入 DnitRepository
  4. dnitRepository.insertdata(2, someJsonDataAsString ); 替换为 jdbcTemplate.executeUpdate("insert into dnit(id, data) VALUES (?,to_json(?))", id, data);

您已经在使用纯 SQL(以非常复杂的方式),如果您需要纯 SQL(并且不需要 JPA),那么只需使用 SQL。

当然,不是直接将 JdbcTemplate 注入到您的控制器中,您可能希望在存储库或服务中隐藏该逻辑/复杂性。

原文由 M. Deinum 发布,翻译遵循 CC BY-SA 4.0 许可协议

试过 这个 但什么都不懂!

要完全使用 jsonbSpring Data JPA (Hibernate) 项目中使用 Vlad Mihalcea 的 休眠类型 库,您应该执行以下操作:

1)将此库添加到您的项目中:

 <dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>2.2.2</version>
</dependency>

2)然后在您的实体中使用它的类型,例如:

 @Data
@NoArgsConstructor
@Entity
@Table(name = "parents")
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class Parent implements Serializable {

    @Id
    @GeneratedValue(strategy = SEQUENCE)
    private Integer id;

    @Column(length = 32, nullable = false)
    private String name;

    @Type(type = "jsonb")
    @Column(columnDefinition = "jsonb")
    private List<Child> children;

    @Type(type = "jsonb")
    @Column(columnDefinition = "jsonb")
    private Bio bio;

    public Parent(String name, List children, Bio bio) {
        this.name = name;
        this.children = children;
        this.bio = bio;
    }
}

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Child implements Serializable {
    private String name;
}

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Bio implements Serializable {
    private String text;
}

然后,您将能够使用例如简单的 JpaRepository 来处理您的对象:

 public interface ParentRepo extends JpaRepository<Parent, Integer> {
}

 parentRepo.save(new Parent(
                     "parent1",
                     asList(new Child("child1"), new Child("child2")),
                     new Bio("bio1")
                )
);

 Parent result = parentRepo.findById(1);
List<Child> children = result.getChildren();
Bio bio = result.getBio();

原文由 Cepr0 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进