一尘不染

如何使用SpringBoot + JPA存储PostgreSQL jsonb?

spring-boot

我正在开发一种迁移软件,它将使用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将始终为String,但我需要jsonb来查询数据库


阅读 1623

收藏
2020-05-30

共1个答案

一尘不染

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

  1. 替换spring-boot-starter-data-jpaspring-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您可能希望将逻辑/复杂性隐藏在存储库或服务中,而不是直接将其注入到控制器中。

2020-05-30