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

具有多个内部连接的JPA自定义查询

甄文彬
2023-03-14

我是spring boot新手,需要关于具有多个内部连接的自定义JPA查询的帮助。基本上,我需要将以下SQL查询转换为JPA查询:

SELECT count(uc.certifications_groups)
    FROM firms f
    INNER JOIN firms_users_map fum on fum.firm_realm_id = f.firm_realm_id
    INNER JOIN users u on u.global_auth_id = fum.global_auth_id
    INNER JOIN users_certifications uc on uc.global_auth_id = u.global_auth_id
    WHERE f.firm_realm_id = 1 and uc.certifications_groups = 'qbo'
    GROUP BY uc.certifications_groups;

下面是代码结构:

公司实体

@Entity(name = "firms")
@Table(name = "firms")
public class FirmEntity {

    @Id
    private long firmRealmId;

    @JoinColumn(name = "tier_name", nullable = false)
    private String tierName;

    @Column(nullable = false)
    private int currentPoints;

    @Column(nullable = true)
    private Date gracePeriodEnd;

    @ManyToMany
    @JoinTable(
        name = "firms_users_map",
        inverseJoinColumns = { @JoinColumn(name = "global_auth_id") },
        joinColumns = { @JoinColumn(name = "firm_realm_id") }
    )
    private Set<UserEntity> users;

    public Set<UserEntity> getUsers() {
        return users;
    }

    public void setUsers(Set<UserEntity> users) {
        this.users = users;
    }

    @Entity
    @Table(name = "users")
    public class UserEntity {

    @Id
    @Column(name="global_auth_id", nullable = false)
    private long global_auth_id;


    public long getGlobal_auth_id() {
        return global_auth_id;
    }

    public void setGlobal_auth_id(long global_auth_id) {
        this.global_auth_id = global_auth_id;
    }

    @OneToMany
    @JoinTable(
        name = "user_certifications",
        inverseJoinColumns = { @JoinColumn(name = "certification_group") },
        joinColumns = {@JoinColumn(name="global_auth_id")}
    )
    private Set<users_certificationsEntity> users_certificationsEntity;


    public Set<users_certificationsEntity> getUser_certifications() {
        return users_certificationsEntity;
    }

    public void setUser_certifications(Set<users_certificationsEntity> user_certifications) {
        this.users_certificationsEntity = user_certifications;
    }

软件库

public interface FirmRepository extends CrudRepository<FirmEntity, Long> {


 @Query("select count(c) from firms f inner join f.users c inner join 
 c.users_certificationsEntity x where f.firmRealmId = ?1 "
        + "and x.certifications_groups=qbo_adv")
int count_qbo_adv_Certification(long firmRealmId)

认证计数信号I mpl

public class CertificationCountSignalImpl implements Signal {

    @Autowired
    private FirmRepository firmRepository;

    @Autowired
    private SignalMetadataRepository signalMetadataRepository;

    @Autowired
    private CertificationCountSignalImpl certificationCountSignalImpl;


    private int get_qbo_certificationPoints(long firmRealmId) {
        if(firmRealmId <=0) {
            throw new IllegalArgumentException();
        }
        int clientCount = firmRepository.countAllClients(firmRealmId);

        int CertificationsCount_QBO_ByRealm_id = firmRepository.count_qbo_Certifications(firmRealmId);  

        int totalPoints =0; 
        int pointsCounter =0;

共有2个答案

严安志
2023-03-14

首先,您可以使用实体配置来声明表之间的关系,并且不要在@Query中使用JOIN词(例如--Construct JPA Query for a OneTo多国关系),或者在Query中使用连接,但在Entity类中不使用anotation@oneTo多国,例如--Hql,如何在具有一对多关系的表之间编写连接查询?

井兴怀
2023-03-14

我使用以下JQL使我的查询工作:

@Query("select count(c) "
+           + "from firms f "
+           + "inner join f.users u "
+           + "inner join u.certifications c "
+           + "where f.firmRealmId = ?1 "
+           + "and c.certificationsGroups='qbo'")
+    int count_qbo_Certifications (long firmRealmId);
 类似资料:
  • 我需要创建一个jpa自定义查询,使用几个表上的联接来获取记录。 以下是我想要达到的目标: 对很少的参数进行数据排序(在运行时决定) 使用where子句进行筛选(在运行时决定) 示例: @query(value=“从用户a中选择a.name,b.city,c.reason在a.id=b.id上连接地址b在a.id=c.id上连接测试c 我无法为其创建常规查询。 任何其他的方法对我来说也是可以接受的来

  • 问题内容: 所以我有四个桌子。每个表都有一个与前一个表ID相同的ID。因此,我的点击表中有一个ID和一个广告来源的ID。在广告表中,它有一个广告ID和一个来自其广告系列的ID。所以这是一个例子。 因此,要找出表4中的值从何而来,我需要遍历每个表并检查它们具有哪个ID。基本上,我想知道表1中的哪些值与表4中的值相关联。 表4中的内容是网站的访问者,表1中的内容是互联网广告。我想知道哪些访客来自哪些广

  • 我在Node.js忘记密码后端路由,我试图使用nodemailer从我从namecheap.com购买的自定义域发送电子邮件,以及电子邮件域。我不确定这是主机、端口/安全还是授权的问题。但是,当我更改主机时,它会给出一个ECONREFUSED错误,所以我相信该部分正在工作。我的防火墙被禁用了(据我所知),我重新启动了,但是很难判断,因为诺顿防病毒软件控制着它。 这是我的代码,取自路由器。在我的后端

  • 我开始学习JPA,并基于我在SQL Server中测试的以下本机SQL实现了一个使用JPA查询的示例: 根据上面的SQL,我构造了以下JPQL查询: 正如您所看到的,我仍然缺少原始查询中的条件。我的问题是,我怎样才能把它放入我的JPQL中?

  • 我想使用带有注释@query的Jpa存储库创建一个连接查询。 我有两张桌子: 和: 我的表实体

  • 我正在做表A和表B的左连接,并试图将结果提取到自定义POJO中,该POJO具有表A和表B中的字段,如下所示: 它适用于除myCode字段之外的所有字段,myCode字段是连接这两个表的字段。对我来说,myCode的值是从正确的表B中获取的,表A中的所有记录在表B中都没有相应的条目。我想知道jooQ如何决定映射到POJO的字段,以及是否在任何地方记录了这种行为。 我的目标是将表A和表B中的所有字段提