当前位置: 首页 > 知识库问答 >
问题:

如何在非主列上使用JPA规范创建查询

顾正初
2023-03-14

我有下面的查询,其中两个表连接在非主列上。该表连接到一个公用列上。

SELECT * from User user, UserDetails ud
WHERE user.user_key = :pUserKey // passed in parameter
      user.common_key = ud.common_key
@Entity
@Table(name = "USER")
@Data
public class User implements java.io.Serializable {

    private static final long serialVersionUID = 1L;
    
    @Id
    @Column(name = "user_key", nullable = false)
    @JsonIgnore
    private Long userKey;
    
    @Column(name = "common_key ", nullable = false)
    @JsonIgnore
    private Long commonKey;
}

用户详细信息

@Entity
@Table(name = "USER_DETAILS")
@Data
public class UserDetails implements java.io.Serializable {

    private static final long serialVersionUID = 1L;
    
    @Id
    @Column(name = "user_details_key", nullable = false)
    @JsonIgnore
    private Long userDetailsKey;
    
    @Column(name = "common_key ", nullable = false)
    @JsonIgnore
    private Long commonKey;
}

如何在JPA规范中实现相同的查询

共有1个答案

闻法
2023-03-14

我已经得到了预期的解决办法。我已经使用query.from()创建了新的

以下是完整的解决方案

public static Specification<User> userAndDetails(Long userKey) {
        return (Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder) -> {
        
            Root<UserDetails> userDetailsRoot = query.from(UserDetails.class);

            Predicate userAndDetailsJoin = builder.equal(
                    root.get(User_.commonKey),
                    userDetailsRoot.get(UserDetails_.commonKey));

            Predicate userKeyPredicate = builder.equal(root.get(User_.userKey),
                    userKey);

            return builder.and(userAndDetailsJoin, userKeyPredicate);
        };
    }
 类似资料:
  • 问题内容: JPA规范是否允许对非主键列的简单引用? 我想在引用中使用在Countrys表上有一个简单的替代/自然键(UNIQUE,NOT NULL)列iso_code,但是Eclipse的Dali显示了验证错误,并且Hibernate抛出了MappingException。 是否允许这种常见情况? 问题答案: @axtavt:看来您的答案不正确。我刚刚收到了来自“ Pro JPA 2.0”作者的

  • 我试图使用JPA规范编写以下查询。从hcp中选择Distincent name,其中区域='Dhaka'; hcp实体如下所示 桌子应该是这样的 所需的结果将根据区域列出不同的名称。如何使用JPA规范在特定字段上应用distinct? 所需的查询和输出:

  • 我正在尝试将查询转换为JPA规范,该查询包含带OR条件的连接操作。 以下是查询: 我试图编写一个规范,但在如何将多个列与OR条件连接方面遇到了障碍。 用户实体: 运营实体 我希望有一个规范来取代上面的查询

  • 我正在使用一个JPA查询,它使用一个规范来检索实体。当我执行查询时,我得到了一个错误: 组织。springframework。数据映射。PropertyReferenceException:找不到类型任务的属性名称! 我已经查看了之前在该网站上提出的类似问题的答案 当我使用调试器逐步检查代码时,条件生成器中的扩展路径将返回嵌入的ID类,但当规范实际用于查询时,该属性似乎正在应用于基本实体类。 我是

  • 我想创建基于JPA规范的过滤器。我正在使用Spring数据。 我的实体: 实体依赖项为:第1节-一对多- 我有一个转换为规范的问题过滤器类。我想了解第节中的所有问题。 通常,我会使用下面编写的SQL查询来获取部分中的所有问题。 我尝试过使用Join创建规范,但不知道如何在问题上的目标参考不可用时创建连接。

  • TL;DR:如何使用Spring Data JPA中的规范复制JPQL Join-Fetch操作? 在本例中,每次我要检索记录时,我还想要它关联的和记录。这一切都按预期工作,对单个的请求将引发3个查询:、和表各一个查询。 问题是,没有理由需要运行3个查询来获得具有嵌入属性和别名的单个实体。这可以在普通SQL中完成,也可以在我的Spring Data JPA存储库中使用JPQL查询完成: 如何使用规