1

我是 JPQL 查询的初学者,但我不明白如何在 JPQL 查询中翻译 SQL 查询:

我有 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;

谢谢您的回答。

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 回答