【问题标题】:JPA or Play Framework list from query joining 2 tables查询加入 2 个表的 JPA 或 Play Framework 列表
【发布时间】:2011-07-03 09:23:37
【问题描述】:

我主要使用 JSF,所以对这个注释主题完全陌生

如果有人可以帮忙

我想要这个查询的列表

SELECT  f.CODE  ,f.NAME || '-' || e.NAME  
FROM FS.ELIGIBLE e  RIGHT
OUTER JOIN FS.FINANCIAL_SUPPORT f ON e.CODE = f.CODE ; 

上面的查询从 2 个表中检索一个列表,并将两个表中的 name 字段连接起来!!

我如何在 JPA 或 Play Framework 支持的另一个查询中执行此操作???

【问题讨论】:

    标签: jpa playframework


    【解决方案1】:

    阅读Play Framework documentation,特别是关于JPA and your Domain Model的部分。

    您可以随时通过调用访问实体管理器

    EntityManager entityManager = JPA.em();
    

    使用它,您可以创建任何您想要的查询,甚至是“本机”查询。例如:

    List<Object> results = JPA.em().createNativeQuery(
        "SELECT  f.CODE  ,f.NAME || '-' || e.NAME "+
        "FROM FS.ELIGIBLE e  RIGHT "+
        "OUTER JOIN FS.FINANCIAL_SUPPORT f ON e.CODE = f.CODE").getResultList()
    

    【讨论】:

    • 这行得通,但我总是觉得有这么大的库堆栈来保持持久性有点令人沮丧,最终还是求助于本机 SQL,即使是最简单的查询(为什么不只使用而是 JDBC?)。使用 JPA 没有更优雅的解决方案吗?
    • @LukasEder 不同意你的看法。高级抽象使简单的事情变得非常简单,并节省了大量编写代码的时间。
    【解决方案2】:

    JPA 不像关系型数据库系统,您可以进行联接、左联接或外联接等查询,它是一种对象映射技术。您也可以像那些 RDBMS 对应物一样执行相同的提取,但使用不同的方法。

    您要做的是创建一个对象,然后将您的第二个对象与您的第一个对象相关联,这是关联 2 个或更多对象的正确方法。我说的对象是你的表。请参阅下面的示例:

    1. 表 1:Items.java
    2. ...
    3. // 在此处进行导入 ...
    4. // 在这里做你的注释就像
    5. @Entity
    6. @Table(name="Items")
    7. 公共类项目实现可序列化{
    8.   私有字符串 ID;
    9.   私有字符串 itemno;
    10.    私有字符串描述;
    11.    私有 Set 供应商; //这是第二张表(1:n 关系)
    12.    ...
    13.    // 不要忘记你的构造函数
    14.    // 在您的供应商的 setter 和 getter 中执行 ff:
    15.    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    16.    @JoinColumn(name="id")
    17.    public Set getVendors() {
    18.       返回供应商;
    19.    }
    20.    public void setVendors(Set 供应商) {
    21.      this.vendors = 供应商;
    22.    }
    23.   ...
    24. }

    表 2:Vendors.java

    1. @Entity
    2. @Table(name="Vendors")
    3. 公共类供应商实现可序列化{
    4.   私有长 ID;
    5.   私有字符串公司;
    6.   私人字符串联系人;
    7.   私有字符串序列;
    8.    ...
    9.    public Vendors() { }
    10.    ...
    11.    // 在你的 setter 和 getter 中
    12.   @Id
    13.   public long getId() {
    14.      返回 ID;
    15.   }
    16.    public void setId(long id) {
    17.       this.id = id;
    18.    }
    19.      ...
    20.   }

    现在在您的查询中,只需像在 ff 中一样进行常规选择:

    1. public void makeQuery(String seq) {
    2.    EntityManagerFactory emf = Persistence.createEntityManagerFactory(...);
    3.    EntityManager em = emf.createEntityManager();
    4.   TypedQuery 查询 = em.createQuery(" SELECT i, j.contact, j.company, j.sequence FROM Items i LEFT OUTER JOIN i.vendors j WHERE i.vendors.sequence = :seq
    5.       ORDER BY i.id", Items.class);
    6.   List items = query.setParameter("sequence", seq).getResultList();
    7.    ...
    8. }

    现在您可以使用 items.vendors.company ... 等等来引用您的第二个表供应商。

    这一点的一个缺点是,JPA 将其相关对象以 Set 的形式制作,参见 Table1 (Items) - private Set 供应商中的声明。由于它是一个 Set,因此与使用 List 不同,它的接收顺序不是按顺序排列的。

    希望这会有所帮助...

    问候,尼尔森·德奥格拉西亚斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多