Java 列出映射Spring JPA的结果

Java 列出映射Spring JPA的结果,java,spring,postgresql,jpa,Java,Spring,Postgresql,Jpa,我使用PostgreSQL,我有这些表,产品和产品介质,它们与产品和产品介质的关系是一对一。我想检索一个产品列表,其中每个产品列表都包含一个产品媒体列表。 为了从数据库中检索它们,我有两个选择 第一种解决方案是首先检索产品列表,然后迭代检索到的列表并执行查询以检索产品列表 问题1: select * from product as p where p.status=1; 检索列表,然后迭代此列表并执行此查询: select * from product_media as pm where pm

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

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

问题1:

select * from product as p where p.status=1;
检索列表,然后迭代此列表并执行此查询:

select * from product_media as pm where pm.product_id=?
第二个是实现join-in查询并从我的数据库中检索所有数据。 查询:

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

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'
         }    
       ]
    }
]

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

  • 假设您的实体定义如下:

    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);
        }
    }
    
    Product.java
  • 使用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>
    
    
    com.fasterxml.jackson.core
    杰克逊数据绑定
    2.7.4
    

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

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

  • 假设您的实体定义如下:

    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);
        }
    }
    
    Product.java
  • 使用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>
    
    
    com.fasterxml.jackson.core
    杰克逊数据绑定
    2.7.4
    

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

    如果您的响应不是
    json
    格式,您可以在下面尝试

    产品
    媒体
    之间存在多对多关系

    Product\u Media
    是一个帮助表,用于维护
    Product
    Media
    实体之间的多对多关系

    产品实体:

    @Entity(name = "product")
    public class Product {
    
        @Id
        @GeneratedValue
        private Long product_id;
    
        @Column
        private String name;
    
        @ManyToMany(cascade = { CascadeType.MERGE }, fetch = FetchType.EAGER)
        @JoinTable(name = "product_media", joinColumns = {
                @JoinColumn(name = "product_id", table = "product") }, inverseJoinColumns = {
                        @JoinColumn(name = "media_id", table = "media") })
        List<Media> medias;
    
    }
    
    由Hibernate生成的SQL

    select
        product0_.product_id as product_1_1_0_,
        product0_.name as name2_1_0_,
        medias1_.product_id as product_1_1_1_,
        media2_.media_id as media_id2_2_1_,
        media2_.media_id as media_id1_0_2_,
        media2_.name as name2_0_2_ 
    from
        product product0_ 
    left outer join
        product_media medias1_ 
            on product0_.product_id=medias1_.product_id 
    left outer join
        media media2_ 
            on medias1_.media_id=media2_.media_id 
    where
        product0_.product_id=?
    
    如果关系是一对多,请更改如下实体

    媒体实体

    @Entity(name = "media")
    public class Media {
    
        @Id
        @GeneratedValue
        private Long id;
    
        @Column
        private String name;
    
        @ManyToOne
        @JoinColumn(name = "product_id", referencedColumnName = "id", nullable = false, updatable = false)
        private Product product;
    
        public Media() {
    
        }
    }
    
    产品实体

    @Entity(name = "product")
    public class Product {
    
        @Id
        @GeneratedValue
        private Long id;
    
        @Column
        private String name;
    
        @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "product")
        List<Media> medias;
    }
    

    如果您的响应不是
    json
    格式,您可以在下面尝试

    产品
    媒体
    之间存在多对多关系

    Product\u Media
    是一个帮助表,用于维护
    Product
    Media
    实体之间的多对多关系

    产品实体:

    @Entity(name = "product")
    public class Product {
    
        @Id
        @GeneratedValue
        private Long product_id;
    
        @Column
        private String name;
    
        @ManyToMany(cascade = { CascadeType.MERGE }, fetch = FetchType.EAGER)
        @JoinTable(name = "product_media", joinColumns = {
                @JoinColumn(name = "product_id", table = "product") }, inverseJoinColumns = {
                        @JoinColumn(name = "media_id", table = "media") })
        List<Media> medias;
    
    }
    
    由Hibernate生成的SQL

    select
        product0_.product_id as product_1_1_0_,
        product0_.name as name2_1_0_,
        medias1_.product_id as product_1_1_1_,
        media2_.media_id as media_id2_2_1_,
        media2_.media_id as media_id1_0_2_,
        media2_.name as name2_0_2_ 
    from
        product product0_ 
    left outer join
        product_media medias1_ 
            on product0_.product_id=medias1_.product_id 
    left outer join
        media media2_ 
            on medias1_.media_id=media2_.media_id 
    where
        product0_.product_id=?
    
    如果关系是一对多,请更改如下实体

    媒体实体

    @Entity(name = "media")
    public class Media {
    
        @Id
        @GeneratedValue
        private Long id;
    
        @Column
        private String name;
    
        @ManyToOne
        @JoinColumn(name = "product_id", referencedColumnName = "id", nullable = false, updatable = false)
        private Product product;
    
        public Media() {
    
        }
    }
    
    产品实体

    @Entity(name = "product")
    public class Product {
    
        @Id
        @GeneratedValue
        private Long id;
    
        @Column
        private String name;
    
        @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "product")
        List<Media> medias;
    }
    


    您使用的是JPA,因此您只需拥有一个OneToMany关联,并使用一个JPQL(而不是SQL)查询和一个连接获取。。。好。。。你应该使用JPA。在你的问题中,你说你想要JSON在哪里?从发布的回复中,我可以看到你有多对多的关系。你正在使用JPA,所以你应该简单地拥有一个OneToMany关联,并使用一个JPQL(而不是SQL)查询和一个连接获取。如果你要使用JPA,那么你应该。。。好。。。你应该使用JPA。在你的问题中,你说你想要JSON在哪里?从发布的回复中,我可以看到你有多对多的关系,我现在有了这些实体。但是对于每个产品,都应该执行一个查询来检索与产品连接的所有媒体。使用第二个选项,SQL with joins,如果您使用上述代码,它将创建一个SQL with joins并执行我的查询是:选择p.id作为id,p.name作为名称,pm.id作为媒体id,pm.multimedia\u path as multimedia\u path from product as p join product\u multimedia as pm on(p.id=pm.product\u id),我想将结果映射到product.classPro1和Pro2具有相同的媒体,你确定这是一对多的关系吗,我相信这是多对多的关系我确定这是一对多的关系。这是一个例子,我现在有这些实体。但是对于每个产品,都应该执行一个查询来检索与产品连接的所有媒体。使用第二个选项,SQL with joins,如果您使用上述代码,它将创建一个SQL with joins并执行我的查询是:选择p.id作为id,p.name作为名称,pm.id作为媒体id,pm.multimedia\u path as multimedia\u path from product as p join product\u multimedia as pm on(p.id=pm.product\u id),我想将结果映射到product.classPro1和Pro2具有相同的媒体,你确定这是一对多的关系吗,我相信这是多对多的关系我确定这是一对多的关系。这是一个例子,我想你已经八岁了,但是如何迭代检索到的数据呢?使用for和if语句?为什么要迭代?如果对象映射正确,则无需进行迭代。框架将为您完成这项工作。正如您在示例中看到的,我自己做了映射;但是如果映射正确,持久性提供程序将返回一个与子对象正确嵌套的产品。我有一个列表,其中每个对象都有每个元组的属性,然后我应该迭代以获得包含所有数据的Json对象。列出产品测试=