2013-03-26 54 views
1

我在JPQL查詢初學者,我不明白我怎麼可以翻譯JPQL查詢的SQL查詢:JPQL查詢的Java EE項目

我有2個表:

  • 客戶(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; 

感謝您的swers。

+0

這可能工作: SELECT m.nameMacroSegment FROM Macro_market米,m.customersÇ WHERE c.idCustomer =:ID – kostja 2013-03-26 11:42:13

+0

@kostja:確定用於請求,但現在,我有此錯誤:m.customers是不映射[SELECT m.nameMacroSegment FROM com.CustomerRequirement.entities.Macro_market m,m.customers c WHERE c.idCustomer =:id] – 2013-03-26 12:29:56

+0

我剛猜測你的映射可能看起來像什麼。我假設'MakroMarket'與'Customer'具有'OneToMany'關係,因此它可能被稱爲'customers'。您應該使用該字段的實際名稱。 PS - 如果你發佈了兩個實體的代碼 - 只有相關部分 - 類聲明,成員,註釋,沒有方法,沒有評論,這將會有所幫助。 – kostja 2013-03-26 12:34:55

回答

0

經過一番商議,我認爲這個查詢應該可以工作。在我寫的評論中的查詢中,我錯過了JOIN聲明。

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

至於問題的時候,你怎麼可以添加新的客戶名單 - 如果你有一個MakroMarket實體marketCustomercustomer你可以將它們添加到像這樣的關係的兩面:

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

如果您創建了一個新的Customer,您還需要使用em.persist(customer);來代替合併來保存它。

我希望這能回答你的問題。

+0

非常感謝,現在有用! – 2013-03-27 09:37:36

+0

@HugoMULLER - 不客氣:)很高興我能幫到你 – kostja 2013-03-27 09:48:10