2012-04-06 66 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