3

我们在实体上定义了 JPA 规范。我想将该规范转换为 JPQL,因此我可以创建与其他实体的连接。(我尝试使用父子关系,但效率不高,并且不允许我们将过滤(规范)放在智利实体上)。早些时候,我们从一个表中读取数据,因此我们制定了运行良好的规范。现在我们需要将它与另一个实体连接起来,为此我想使用 JPQL 而不是规范。我想将一张表上的规范转换为 JPQL,而不是将其与其他实体连接。

4

2 回答 2

0

假设您有用户和列表实体

在 JPQL 你会写这样的东西

public List<User> getUserByName(String username) {
    String queryString = "select u from User u where u.name= '"+username+"' ";
    Query query = getEntityManager().createQuery(queryString);
    return query.getResultList();
}

使用早于 5.1 的 JPA 和 Hibernate

即使使用 JPA 2.1 和 Hibernate 5.0,仍然无法加入两个不相关的实体。

如果 User 和 UserAddress 彼此不相关

List<Object[]> results = em.createQuery("SELECT u FROM User u, UserAddress ua WHERE u.firstName = ua.firstName AND u.lastName = ua.lastName").getResultList();

Hibernate 会将其转换为像这样的交叉连接

User user01_ cross join UserAddress useraddress1_

使用休眠 5.1

相同的查询将被视为内部联接

List<Object[]> results = em.createQuery("SELECT u FROM User u, UserAddress ua WHERE u.firstName = ua.firstName AND u.lastName = ua.lastName").getResultList();

User user01_ inner Join UserAddress useraddress1_

其他印象点:

不允许在连接子句中使用子查询。在 JPQL 中,子查询只允许在 WHERE 和 HAVING 部分。

于 2018-08-07T09:24:01.110 回答
0

在您的存储库方法上使用 @query 注释并在 @query 注释中编写您的 JPQL 查询。

您可以在 @query 注释中使用您的实体名称引用表名。

于 2018-08-06T12:04:52.247 回答