1

私はJPQLクエリの初心者ですが、JPQLクエリでSQLクエリを変換する方法がわかりません。

私は2つのテーブルを持っています:

  • Customer(idCustomer、...、idMacroMarket
  • MacroMarket(idMacroMarketnameMacroMarket ...)

これらのテーブルは、@ ManytoOne(顧客の場合)および@OneToMany(MacroMarketの場合)のリレーションでリンクされています。

SQLクエリ:

SELECT nameMacroSegment FROM Macro_market m
INNER JOIN Customer c ON c.idMacroMarket = m.idMacroMarket
WHERE idCustomer = id;

JPQLクエリ:

SELECT nameMacroSegment FROM Macro_market m
...
...
WHERE idCustomer = :id

エンティティ

 @Entity
    @Table(name="macro_market")
    public class Macro_market implements Serializable {

        private static final long serialVersionUID = 1L;

        /** ATTRIBUTES **/

        @Id
        @GeneratedValue( strategy = GenerationType.IDENTITY)
        private Long idMacroMarket;

        private String nameMacroSegment;
        private String nameMarketSegment;

        @OneToMany(mappedBy="macMar")
        private List<Customer> customers;
        ...
        ...

    @Entity
    @Table(name="customer")
    public class Customer implements Serializable {

        private static final long serialVersionUID = 1L;

        @Id
        @GeneratedValue( strategy = GenerationType.IDENTITY)
        private Long idCustomer;

        ...     
        ...
        /** RELATIONS **/
        // CUSTOMER - MACRO_MARKET
        @ManyToOne(cascade=CascadeType.ALL)
        @JoinColumn(name="idMacroMarket",referencedColumnName="idMacroMarket")
        private Macro_market macMar;

ご回答ありがとうございます。

4

1 に答える 1

0

いくつかの検討の後、このクエリは機能するはずだと思います。コメントに書いた質問で、私はそのJOIN声明を見逃しました。

SELECT m.nameMacroSegment FROM Macro_market m JOIN m.customers
WHERE c.idCustomer = :id

いつ、どのように新しい顧客をリストに追加できるかという質問については、MakroMarketエンティティがmarketあり、Customer customer次のように関係の両側に追加できる場合は、次のようになります。

market.getCustomers().add(customer);
customer.setMarket(market);
customer = entityManager.merge(customer); //save the changes to both entites with cascade

新しいものを作成した場合はCustomer、を使用してマージするのではなく、それを永続化する必要がありますem.persist(customer);

これがあなたの質問に答えることを願っています。

于 2013-03-26T15:38:13.703 に答える