【问题标题】:Join tables in eclipselink (jpa)在 eclipselink (jpa) 中加入表
【发布时间】:2015-06-04 00:03:33
【问题描述】:

我正在尝试将一个简单的 sql 语句转换为 jpql 但徒劳无功。我有一个实体“Banque”,它有很多“Compte”,我正在尝试使用 id_Banque 获取特定“Banque”的所有“Compte”。

这是sql语句:

SELECT COMPTE.* FROM COMPTE INNER JOIN BANQUE ON COMPTE.ID_BANQUE=BANQUE.ID_BANQUE;

=============================实体银行========== ===============

@Entity
@Table(name="BANQUE")
public class Banque implements Serializable{
@Id
    @GeneratedValue(strategy=GenerationType.AUTO, generator="banque_seq_gen")
    @SequenceGenerator(name="banque_seq_gen", sequenceName="BANQUE_SEQ", allocationSize = 1, initialValue = 1)
    private Long id_banque;

@OneToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY, mappedBy = "Banque")
    private Set<Compte> comptes;

public Banque(){

    }
}

=============================实体竞争========== ===============

@Entity
@Table(name="COMPTE")
public class Compte implements Serializable{

@Id
    @GeneratedValue(strategy=GenerationType.AUTO, generator="compte_seq_gen")
    @SequenceGenerator(name="compte_seq_gen", sequenceName="COMPTE_SEQ", allocationSize = 1, initialValue = 1)
    private Long id_compte;

@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_BANQUE")
    private Banque Banque;

    public Compte(){

    }
}

以下方法帮助我获取与特定银行关联的所有comptes(实体compte)(来自id_banque):

public Set<Compte> getComptesFromIdBanque(Long id_banque){
    EntityManager em=new JPAContainerFactory().createEntityManagerForPersistenceUnit("addressbook");
    Query query = em.createQuery("SELECT c FROM Compte c INNER JOIN c.Banque b WHERE b.id_banque = :id_banque");

    query.setParameter("id_banque", id_banque);
    Set<Compte> comptes = new HashSet<>(query.getResultList());
    return comptes;
}

这是两张表的插图以及我想要的:

然后在 ComboBox 中显示此组合列表:

compteCombo.addItems(saut.getComptesFromIdBanque(banque.getId_banque()));
compteCombo.setItemCaptionPropertyId("numero");

不幸的是,这不会在组合框中显示任何项目。

我希望我能找到一个相关的答案,因为我徒劳地搜索了这个。对我有很大帮助。

谢谢。

【问题讨论】:

  • 这不能回答你的问题,但我对你简单的 SQL 语句感到困惑。你就不能SELECT * FROM COMPTE WHERE ID_BANQUE=N吗?
  • 同样,您的 JPQL 对我来说看起来不错,但您可以简化它:SELECT c FROM Compte c WHERE c.banque.id_banque = :id_banque。在某些情况下,JPA 可以为您遍历对象图。
  • 您提到“这不会在组合框中显示任何项目”。在涉及更多组件(例如 UI)之前,您应该确认您的查询正在返回结果。在getComptesFromIdBanque中放一些日志语句来确认你的查询结果。
  • 如果您使用的是 Netbeans,您可以在 JPQL query editor 中测试您的 JPQL 查询。
  • 最后,如果您还没有阅读过,请阅读完整的JPQL tutorial。篇幅不长,很好的介绍,关系遍历的描述很重要。

标签: sql jpa eclipselink vaadin jpql


【解决方案1】:

您的 JPA 查询对我来说似乎很好(尽管正如 @Davids 提到的,它可以简化为 SELECT c FROM Compte c WHERE c.banque.id_banque = :id_banque)。

我的猜测是您的ComboBox caption 没有正确设置以显示任何内容。

首先,编写一个测试以确保您的 JPA 函数返回正确的数据。然后使用ComboBoxsetItemCaptionMode 来获得正确的设置。假设你的 Compete 类有一个 getNumero() 方法,你可以像这样设置你的 Combobox:

compteCombo = new ComboBox( "Caption", saut.getComptesFromIdBanque(banque.getId_banque()) );
compteCombo.setItemCaptionMode( ItemCaptionMode.PROPERTY );
compteCombo.setItemCaptionPropertyId( "numero" );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2013-09-19
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多