2013-03-26 64 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