【问题标题】:SQL query to JPA Joins对 JPA 联接的 SQL 查询
【发布时间】:2010-11-02 20:59:52
【问题描述】:

今天刚开始使用 JPA,所以我对它很陌生。
在 JPA 中如何说
"SELECT login.ID, userID, logInTime, logOutTime, user.ID AS 'uID', surname FROM login, user WHERE login.userID = user.ID"
我需要通过用户 ID 加入两个表。
我在网上浏览了几个教程,但找不到答案。
谢谢!

【问题讨论】:

  • 您能描述一下您的领域模型吗?否则很难就编写 JPQL 查询向您提供建议。

标签: java sql jpa


【解决方案1】:

我猜测您的域模型至少包含两个实体UserLogin,后者代表类似于会话的东西。 (基数User-1:n-Session

我的虚构实体:

@Entity
class User {
    @OneToMany(mappedBy="user")
    private List<Login> logins;
    ...
}

@Entity
class Login {
    @ManyToOne
    private User;
    ...
}

检索所有Logins:

jpql: "from Login"

(默认获取关联的User 对象。在@ManyToOne 端,默认获取类型是急切获取。)

检索所有Users:

jpql: "select u from User u join fetch u.logins"

(默认情况下不获取关联的List&lt;Login&gt; 对象。在@OneToMany 端,默认获取类型是延迟获取。)

JPA 入门:openJPA documentation (请查看第 4 章和第 5 章的实体设计和第 10 章的 JPQL。openJPA 文档的通用 JPA 部分适用于所有 JPA 实现。)

附:如果您在问题中提供更多细节会更容易。

【讨论】:

    【解决方案2】:

    JPQL 查询是针对对象而不是表编写的。在不知道对象是什么以及它们之间的关系是如何定义的情况下编写查询是不可能的。

    您需要首先创建代表LoginUser 的实体对象。您映射它们之间的关系,然后它成为查询的联接。

    【讨论】:

      【解决方案3】:

      假设 login 和 user 现在是对象,并且假设 login 和 user 之间的关系是一个用户有多个登录,就会是这样的

      select 
             L.ID,
             u.userID, 
             L.logInTime, 
             L.logOutTime,
             u.ID 
      from 
             User U, 
             IN(u.logins) L /*note that the IN makes the inner join between Login and user*/
      

      请记住,我假设实体之间的映射

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-11
        • 2022-01-20
        相关资源
        最近更新 更多