0

私は 2 つのエンティティ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挿入することです。上記の表からのみ選択する方法はありますか?idscustomer_productsids

4

2 に答える 2

1

JPA / Hibernateを使用してエンティティオブジェクト全体をインスタンス化せずに、列から個別のエンティティデータを取得することができます。

これは1対1で完璧に機能しますが、多対多の関係についてはわかりません。

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 を挿入するだけです。直接処理しCustomerたりProduct、他のデータなしで ID のみを取得したりする方法はありません。それはORMのほんの一部です。

ただし、ネイティブ SQL クエリを使用して、データベースから単一のデータを選択することはできます。 この男は、SQLQuery の使用法についても良い例を提供しています。

編集

あなたの質問を読み直した後、ID がcustomer_productテーブルに挿入されていると言っていることに気付きました。したがって、私の最初の段落は実際には正しくありません。顧客に製品を追加するだけで、それが相互参照テーブルであるため、ID を挿入するだけです。

ただし、解決策は同じです。customerまたはから ID のみを選択する場合productは、SQL クエリを使用する必要があります。ID を直接選択したい場合customer_product(これは奇妙なことです)、SQL クエリを使用するか、CustomerProductオブジェクトを作成する必要があります (これはさらに奇妙なことです)。

于 2012-04-06T22:24:26.653 に答える