【问题标题】:JPA Custom Query with multiple Inner Joins具有多个内部联接的 JPA 自定义查询
【发布时间】:2018-03-09 17:07:12
【问题描述】:

我是 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;
    }

FirmRepository

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)

CertificationCountSignalImpl

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;

【问题讨论】:

  • 你只是说你想做?问题出在哪里?
  • 您当前的查询是什么样子的,它有什么作用?

标签: hibernate spring-boot spring-data-jpa inner-join


【解决方案1】:

我使用以下 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);

【讨论】:

    【解决方案2】:

    首先,您可以使用实体配置来声明表之间的关系,并且不要在@query 中使用 JOIN 字(例如 --Construct JPA query for a OneToMany relation), 或者在 Query 中使用 join 但在 Entity 类中不使用 @oneToMany 注释,例如 --Hql, How to write join query between tables that has one to many relationship?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多