java - 在插入多对多表之前, hibernate 选择多个列

标签 java hibernate

我有两个具有多对多关系的实体CustomerProduct

`

@ManyToMany(cascade = CascadeType.MERGE, fetch=FetchType.LAZY)
    @JoinTable(
            name = "customer_products",
            joinColumns={@JoinColumn(name="customer_id")},
            inverseJoinColumns = {@JoinColumn(name="product_id")}) 
    @CollectionId(
            columns = @Column(name="id"),
            type = @Type(type="long"),
            generator = "native"
    )
    public Collection<Product> getProducts() {
        return products;
    }
    public void addProduct(Product product){
        this.products.add(product);
    }
    public void setProducts(Collection<Product> products) {
        this.products = products;
    }

`

我想添加客户产品

`

    Customer customer = (Customer)session.load(Customer.class, new Long(1));
    Product product = (Product) session.load(Product.class, new Long(1));
    customer.addProduct(product);
    session.persist(customer);`

代码的作用是,它从表 CustomerProducts 中选择所有列,并仅将这些表中的 ids 插入 customer_products 表。有没有办法从上面的表中只选择 ids

最佳答案

可以从列中检索单独的实体数据,而无需使用 JPA/Hibernate 实例化整个实体对象。

这对于一对一关系来说是完美的,但不确定多对多关系:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Object[]> q = cb.createQuery(Object[].class);
Root<Customer> c = q.from(Customer.class);
q.select(cb.array(c.get("id"), c.get("products").get("id")));

List<Object[]> results = em.createQuery(q).getResultList();
for (Object[] result : results) {
  System.out.println("Customer id: " + result[0] + ", Product id: " + result[1]);
}

仍然值得一试,可能会让你走上正轨。 Look for more information on JPQL and CriteriaBuilder queries.

顺便说一句,如果您能提供为什么需要这样做的原因,也许我们可以从新的角度提供替代解决方案,因为现在我们不明白为什么需要这样做。

关于java - 在插入多对多表之前, hibernate 选择多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10049773/

相关文章:

java - Japid:从 HashMap 获取键值时的奇怪行为

java - 命令行上的 MVC

java - 重复元素生成器列表

spring - 在 Spring JPA Hibernate 中使用蛇形案例

java - 使用 Spring Data JPA 的多对多映射和保存问题

java - Jenkins 将参数传递给 testNG Java

java - 无法一次将多个图像移动到另一个文件夹

java - 在 hibernate 状态下可连接多对多

mysql - 由 : java. sql.SQLSyntaxErrorException : [. ..] 版本引起,以便在第 1 行 'order (id)' 附近使用正确的语法

java - MySQL 主机由于许多连接错误而被阻止