有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javahibernatehql。子查询中的多个

我有以下实体:

@Entity
public class Company {
   ....
   @OneToMany
   private List<Product> products = new Arraylist<>();           
   ....
}

@Entity
public class Product {
   ....
   @Column(name="product_key")
   private String productKey; // same value as in ProductCategory
   ....
}

@Entity
public class ProductCategory{
   ....
   @Column(name="product_key")
   private String productKey // same value as in Product
   @ManyToMany 
   @JoinTable (...)
   private List<Category> categories = new ArrayList<>();

   ....
}

我想写一个查询,返回公司及其相应的类别:

Company - List<Category>

也就是说,我想要每个公司的产品总分类

目前,我最终得到了这个HQL查询,但它不起作用:

SELECT DISTINCT c, 
        (SELECT pc.categories 
         FROM ProductCategories pc 
         LEFT JOIN c.products products
         WHERE pc.productKey IN products.productKey) 
FROM Company c

我试图使用@JoinFormula将虚拟List<Categories>字段添加到Company实体,但没有成功(@JoinFormula不能用于列表类型,只能用于单个值)


共 (1) 个答案

  1. # 1 楼答案

    我认为你的数据库设计让解决方案变得困难

    自公司;产品具有一对多关系,关系的所有者应该是产品。因此,您可以在每个产品中保留对该公司的引用

    如果我是你,我会选择这样的设计

    公司级

    @Entity
    public class Company {
        @OneToMany(mappedBy="company", cascade = CascadeType.ALL)
        private List<Product> products = new ArrayList<Product>();
    
        @Id
        private int companyId;
    
    }
    

    产品类别

    @Entity
    public class Product {
        @Id
        @Column(name = "product_key")
        private String productKey; // same value as in ProductCategory
    
        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "company", nullable = false)
        private Company company;
    
        @ManyToMany(cascade = CascadeType.ALL, mappedBy="products")
        private List<ProductCategory> categories = new ArrayList<ProductCategory>();
    }
    

    ProductCategory类

     @Entity
        public class ProductCategory {                      
    
            @ManyToMany(cascade = CascadeType.ALL)
            @JoinTable(name="ProductWiseCategory", joinColumns=@JoinColumn(name="cat_name"),
                      inverseJoinColumns=@JoinColumn(name="product_key") )
            private List<Product> products = new ArrayList<Product>();