【问题标题】:Open JPA how do I get back results from foreign key relations打开 JPA 如何从外键关系中获取结果
【发布时间】:2012-04-16 13:42:45
【问题描述】:

早上好。我一直在寻找试图回答这个问题的方法。

如果您的表具有指向另一个表的外键,并且您想要两个表的结果,则使用基本 sql 对外键进行内部连接,您将获得您请求的所有结果信息。当您在外键上生成 JPA 实体时,您会在外键列上获得 @oneToone 注释、@oneToMany、@ManyToMany、@ManyToOne 等。我在外键上有@oneToMany,在相关表列的主键上有相应的@ManyToOne 我还在正确的列上有@joinedON 注释...我还有一个基本的命名查询,它将从第一个中选择所有内容桌子。我需要像在基本 sql 中那样做一个连接来从两个表中获取信息吗?或者我有这些注释的事实会为我拉回这些记录吗?要清楚,如果我有基于外键关系与表 B 相关的表 A,并且我想要两个表中的记录,我将根据外键将表 A 连接到 B 或

Select * From A inner Join B on A.column2 = B.column1

或其他一些类似的废话(如果它不完全正确,请原谅我的 sql,但你明白了)...... 该查询将从 A 和 B 中选择所有列,其中这两个选定的列... 这是我正在使用的命名查询....

@NamedQuery(name="getQuickLaunch", query = "SELECT q FROM QuickLaunch q")

这就是我在无状态会话 bean 中的调用方式...

try
    {
        System.out.println("testing 1..2..3");
        listQL = emf.createNamedQuery("getQuickLaunch").getResultList();
        System.out.println("What is the size of this list: number "+listQL.size());
        qLaunchArr = listQL.toArray(new QuickLaunch[listQL.size()]);            

    }

现在该调用返回表 A 的所有列,但缺少表 B 的列。我的第一反应是更改查询以连接两个表……但这让我想到什么是使用 JPA 的重点是,如果我只是在不同的地方编写与我将要编写的查询相同的查询。另外,我不想忽略一些简单的事情。那么你说堆栈溢出爱好者呢?使用JPA如何取回joined query的所有数据?

【问题讨论】:

    标签: jpa-2.0 named-query


    【解决方案1】:

    假设您有一个与联系人实体有 OneToMany 关联的 Person 实体。

    当你从 entityManager 获取 Person 时,调用其联系人集合上的任何方法都会延迟加载该人的联系人列表:

    person.getContacts().size();
    // triggers a query select * from contact c where c.personId = ?
    

    如果您想使用单个查询来加载一个人及其所有联系人,您需要在 SQL 查询中使用 fetch

    select p from Person p 
    left join fetch p.contacts
    where ...
    

    您也可以使用@OneToMany(lazy = false) 将关联本身标记为预加载,但每次加载一个人(如em.find() 或任何查询)时,它的联系人也会被加载。

    【讨论】:

    • 这会是命名查询中的提取吗?
    • 查询是否被命名并不会改变任何东西。 JPQL 是 JPQL。如果您希望命名查询执行提取,则将连接提取添加到命名查询。
    • 我一定需要那里吗?我需要指定所需的 ID 连接列吗?到目前为止,我看到的所有例子都在这方面有点模糊
    • 如果集合为空,则表示映射错误或数据库中没有子实体,而不是您错过了 fetch join。
    • 我遇到了一些我无法弄清楚的奇怪异常... java.lang.InternalError: java.lang.reflect.InvocationTargetException 我不知道大家在工作时是否见过与 JPA 的但我很难过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2020-06-06
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    相关资源
    最近更新 更多