【发布时间】: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