0

我有两个 EntityCustomerProductwith relation many-to-many

`

@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从上面的表格中选择?

4

2 回答 2

1

可以从列中检索单独的实体数据,而无需使用 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]);
}

仍然值得一试,可能会让你走上正轨。查找有关 JPQL 和 CriteriaBuilder 查询的更多信息。

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

于 2012-04-06T22:48:01.760 回答
0

not null它只是将 id 插入表中,因为这就是您在实体上设置的所有内容,并且您对其他列没有任何约束。没有办法处理CustomerProduct直接获取他们的 id 而没有其他数据。这只是 ORM 的一部分。

但是,您可以使用本机 SQL 查询从数据库中选择单条数据。 这个人也提供了一个很好的 SQLQuery 用法示例。

编辑

重新阅读您的问题后,我意识到您说的是 ids 被插入到customer_product表中。所以我的第一段并不正确。它只是插入 id,因为您只是向客户添加产品,这就是您的交叉引用表。

但是,解决方案是相同的。如果您只想从customeror中选择 id product,则需要使用 SQL 查询。如果您想customer_product直接从中选择 id(这有点奇怪),您需要使用 SQL 查询或创建一个CustomerProduct对象(这会更奇怪)。

于 2012-04-06T22:24:26.653 回答