2013-03-26 2 views
1

Я новичок в запросах JPQL, и я не понимаю, как я могу перевести запрос SQL в JPQL запроса:JPQL запросов для Java EE Project

У меня есть 2 таблицы:

  • клиентов (idCustomer, ..., idMacroMarket)
  • MacroMarket (idMacroMarket, nameMacroMarket ...)

Эти таблицы связаны с отношением @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

Это может работать: ВЫБРАТЬ m.nameMacroSegment ОТ Macro_market м, m.customers гр WHERE c.idCustomer =: ID – kostja

+0

@kostja: Ok для запроса, но теперь у меня есть эта ошибка: m.customers не сопоставлен [SELECT m.nameMacroSegment FROM com.CustomerRequirement.entities.Macro_market m, m.customers c WHERE c.idCustomer =: id] –

+0

Я просто догадался, как может выглядеть ваше сопоставление. Я предположил, что, поскольку «MakroMarket» имеет отношение «OneToMany» к «Клиенту», его можно назвать «клиентами». Вы должны использовать любое фактическое имя поля. PS - это помогло бы, если бы вы разместили код для двух объектов - только соответствующее объявление класса деталей, членов, аннотаций, методов, комментариев. – kostja

ответ

0

После некоторого обсуждения, я думаю, этот запрос должен работать. В запросе, который я написал в комментариях, я пропустил оператор JOIN.

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

Что касается вопроса о том, когда и как вы можете добавить новых клиентов в список - если у вас есть MakroMarket сущность market и Customercustomer Вы можете добавить их в обе стороны отношения, как это:

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

Если вы создали новый Customer, вам также необходимо будет его перенести вместо слияния, используя em.persist(customer);.

Надеюсь, это ответит на ваш вопрос.

+0

Спасибо, много, сейчас работает! –

+0

@HugoMULLER - добро пожаловать :) рад, что смогу помочь – kostja

Смежные вопросы