2012-04-06 72 views
0

我有两个实体CustomerProduct,关系为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

回答

0

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

但是,您可以使用native SQL query从数据库中选择单个数据片段。 This guy也提供了SQLQuery用法的一个很好的例子。

编辑

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

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

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]); 
} 

还是值得一试,可能让你在正确的轨道上。 Look for more information on JPQL and CriteriaBuilder queries.

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

+0

我认为在性能方面会更好。它发送和接收的数据较少。我错了还是微不足道? – user1137146 2012-04-07 09:23:24

+0

但是你打算如何处理ID? – JMelnik 2012-04-07 10:54:15

+0

我这样理解。当在Customer类的hibernate中调用addProduct方法时,会在customer_products表中添加一行,并且它唯一添加的列是来自Customer和Table的表的ids。所以基本上我不需要选择其余的数据。 – user1137146 2012-04-07 11:07:24