java 如何在一列中插入多个值?

3hvapo4f  于 2023-01-07  发布在  Java
关注(0)|答案(1)|浏览(143)

我有一个关于mysql java pojo的问题。我试图在一列中插入多个值。但是代码抛出了空值。这些sql查询不是在jpa上使用的,而是在r2dbc spring webflux上使用的。正如你所知道的,r2dbc驱动程序不支持表关系,所以我试图直接插入值到每个表中。首先我做了pojo代码。

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Table
public class Post {
 
    @Id
    @Column("post_id")
    private Long postId;
    
    @Column
    private String title;
  
    @Column
    private String body;
    
    @Column("tag_id")
    private Collection<Long> tagId;  // value of tagId is null
}

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Table
public class Tag {
  
    @Id
    @Column("tag_id")
    private Long tagId;

    @Column
    private String body;
    
    @Column("post_id")
    private Long postId;
}

然后执行下面的SQL语句

CREATE TABLE IF NOT EXISTS post (
    post_id BIGINT NOT NULL AUTO_INCREMENT,
    title VARCHAR(30) NOT NULL,
    body TEXT,
    
    PRIMARY KEY (post_id)
);

CREATE TABLE IF NOT EXISTS tag (
    tag_id BIGINT NOT NULL AUTO_INCREMENT,
    body VARCHAR(255),
    post_id BIGINT NOT NULL,

    PRIMARY KEY (tag_id),
    CONSTRAINT tag_ibfk_1 FOREIGN KEY (post_id) REFERENCES post (post_id) ON DELETE CASCADE
);

post和tag表的表关系是一对多,下面的代码是sql插入代码。

INSERT INTO post (post_id, title, body) VALUES (1, 2, 'Title 1', 'post #1 body');
INSERT INTO post (post_id, title, body) VALUES (2, 2, 'Title 2', 'post #2 body');

INSERT INTO tag (tag_id, post_id, body) VALUES (1, 1, 'first tag');
INSERT INTO tag (tag_id, post_id, body) VALUES (2, 1, 'second tag');
INSERT INTO tag (tag_id, post_id, body) VALUES (3, 2, 'third tag');
INSERT INTO tag (tag_id, post_id, body) VALUES (4, 2, 'last tag');

以上SQL语句在项目启动时执行,'post' java类的'tagId'成员变量为java Collection类型,即有多个标签值,但当React网响应返回时,标签值为空。

http://localhost:8080/route/post/all

[{"postId":1,"title":"Title 1","body":"post #1 body","tagId":null},{"postId":2,"title":"Title 2","body":"post #2 body","tagId":null}]

如何将标签类的多个tag_id值插入post.tagId?有什么想法吗?

68bkxrlz

68bkxrlz1#

你不能在R2DBC中直接链接tags表。另一种方法是同时执行两个查询。由于我不知道你的端点是什么样子的,下面是我对它的实现:
标签库:

public interface TagRepository extends ReactiveCrudRepository<Tag, Integer> {
    Flux<Tag> getTagsByPostId(@Param("post_id") Integer postId);
}

后存储库:

public interface PostRepository extends ReactiveCrudRepository<Post, Integer> {
}

然后,要获取posts标签,您可以在有post id的情况下一次执行两个查询:

Mono.zip(tagRepository.getTagsByPostId(postID).collectList(),
postRepository.findById(postID));

Mono.zip函数返回一个Tuple<List<Tag>, Post>之后,你可以使用tuple.getT1()来获取标签列表,使用tuple.getT2()来获取帖子。

相关问题