gpt4 book ai didi

java - 列表结果映射 Spring JPA

转载 作者:行者123 更新时间:2023-11-29 14:10:32 25 4
gpt4 key购买 nike

我使用 PostgreSQL,并且我有这些表、产品和产品媒体,产品和产品媒体上的关系是 OneToMany。我想检索一个包含产品的列表,其中每个产品都包含一个 product_media 列表。为了从数据库中检索它们,我有两个选择。

第一个解决方案是首先检索产品列表,然后迭代检索到的列表并执行查询以检索 product_media 列表。

查询 1:

select * from product as p where p.status=1;

检索列表,然后迭代此列表并执行此查询:

select * from product_media as pm where pm.product_id=?

其次是在查询中实现连接并从我的数据库中检索所有数据。查询:

select * from product as p Join product_media as pm on (p.id=pm.product_id)

检索包含所有数据的复杂列表。第二个选项的问题是不知道将此列表映射到具有以下格式的对象的优雅方法。你知道如何将结果自动映射成这种格式吗?

product:[
{
id:1,
name:'Pro1',
medias:[
{
id:1,
uuid:'asdfi-asdf-rg-fgsdf-do'
},
{
id:2,
uuid:'asdfi-asdf-rg-fgsdf-do'
}
]
},
{
id:2,
name:'Pro2',
medias:[
{
id:5,
uuid:'asdfi-asdf-rg-fgsdf-do'
},
{
id:7,
uuid:'asdfi-asdf-rg-fgsdf-do'
}
]
}
]

最佳答案

我认为第二种变体是更好的选择。从数据库中获取对象树后,您可以执行以下操作来实现上面发布的内容:

  1. 假设您的实体定义如下:

    产品.java

    public class Product {

    private long id;
    private String name;
    private List<ProductMedia> mediaList;


    public Product() {
    mediaList = new ArrayList<ProductMedia>();
    }

    public Product(long id, String name) {
    this.id = id;
    this.name = name;
    mediaList = new ArrayList<ProductMedia>();
    }
    // getters + setters
    }

    ProductMedia.java

    public class ProductMedia {
    private long id;
    private String uuid;

    public ProductMedia() { }

    public ProductMedia(long id, String uuid) {
    this.uuid = uuid;
    }
    // getters + setters
    }
  2. 使用 Jackson 库,您可以生成如下输出:

    public class JsonTest {

    public static void main(String[] args) throws IOException {

    ObjectMapper mapper = new ObjectMapper();

    mapper.enable(SerializationFeature.INDENT_OUTPUT);

    Product prod = new Product(1, "p1");

    ProductMedia pm = new ProductMedia(1, "uuid1");
    ProductMedia pm2 = new ProductMedia(2, "uuid2");

    prod.getMediaList().add(pm);
    prod.getMediaList().add(pm2);


    Product prod1 = new Product(2, "p2");

    ProductMedia pm3 = new ProductMedia(3, "uuid3");
    ProductMedia pm4 = new ProductMedia(4, "uuid4");

    prod1.getMediaList().add(pm3);
    prod1.getMediaList().add(pm4);

    Product[] pList = {prod, prod1};

    mapper.writeValue(System.out, pList);
    }
    }

    在此示例中,我将输出写入控制台。但是您不仅限于此;您可以通过 FileOutputStream 写入文件。

为了能够运行这个例子,你需要添加依赖;如果您使用 Maven,您可以将以下内容添加到您的 POM 中:

    <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.4</version>
</dependency>

否则将依赖项的 jar 添加到您的项目构建路径中。

关于java - 列表结果映射 Spring JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37767055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com