SQL 服务器数据库中带有 Group by 子句的 JPQL 无法正常工作

JPQL with Group by clause in SQL Server database not working

我是 SQL 服务器数据库的新手。下面的 JPQL 查询没有被执行,也没有抛出任何错误。只是我的应用程序挂在这个查询上。此代码适用于 MySQL 数据库,但不适用于 SQL Server(2019) 数据库。

@Query(value = "SELECT R.riskType, count(distinct V.bname) FROM RiskViolation V JOIN V.job J JOIN V.risk R WHERE J.id = ?1 GROUP BY R.riskType ")
public List<Object[]> sodUserByRiskType(Long jobId);

但是当我 运行 下面转换的 sql 查询直接在 SQL 服务器数据库中时,它工作正常。

select count(distinct riskviolat0_.bname) as col_1_0_, risklog2_.risk_type as col_0_0_ from risk_violation riskviolat0_ inner join analysis_job analysisjo1_ on riskviolat0_.job_id=analysisjo1_.id inner join risk_log risklog2_ on riskviolat0_.risk_id=risklog2_.id where analysisjo1_.id=? group by risklog2_.risk_type;

这是 JPQL 查询中使用的 Java 实体 类:

RiskViolation.java

@Entity
@Table(name = "risk_violation")
public class RiskViolation {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "job_id")
private AnalysisJob job;

private String bname;

private String riskName;

private String violations;

@Column(name = "violated", columnDefinition = "BIT", length = 1)
private boolean violated;

@Column(name = "simulation", columnDefinition = "BIT", length = 1)
private boolean simulation;

@Column(name = "mitigation_name")
private String mitigationName;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "risk_id")
private RiskLog risk;

@JsonIgnore
@OneToMany(mappedBy = "riskViolation", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<RuleViolation> ruleViolations;
}

AnalysisJob.java

@Entity
@Table(name = "analysis_job")
public class AnalysisJob {

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "profile_name")
private String profileName;

@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "profile_id")
@OnDelete(action = OnDeleteAction.CASCADE)
private AnalysisProfileLog profileLog;

@Column(name = "description")
private String description;

@Column(name = "status")
private String status;

@Column(name = "started_on")
private Date startedOn;

@Column(name = "completed_on")
private Date completedOn;

@Column(name = "completion_message")
private String completionMessage;

@Column(name = "percent_completed")
private float percentCompleted;

@Column(name = "run_by")
private String runBy;

@Column(name = "removed", columnDefinition = "BIT", length = 1)
private boolean removed;

@OneToMany(mappedBy = "job", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
private List<JobResultData> resultData;

@Column(name = "pos_analysis", columnDefinition = "BIT", length = 1)
private boolean posAnalysis;

@Column(name = "submitted", columnDefinition = "BIT", length = 1)
private boolean submitted;

@Column(name = "position_id")
private String positionId;
}

RiskLog.java

@Entity
@Table(name = "risk_log")
public class RiskLog {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private Long jobId;

private String name;

private String riskDescription;

private String riskCondition;

private String businessProcess;

@Column(name = "business_sub_process")
private String subProc;

private String riskType;

@JsonIgnore
@OneToMany(mappedBy = "riskLog", cascade = CascadeType.ALL)
protected List<RuleLog> rules;
}

我是否需要对查询和实体进行任何更改 类 才能使其正常工作?

这里是Query Plan URL

Estimated Execution Plan

Actual Execution Plan

Query Plan with Actual Rows

它在避免 Java class(我的业务逻辑所在的位置)和 JPA 存储库(用于执行 JPQL 查询)之间的外观 class 之后起作用。从 Java class 直接调用 JPA 存储库方法。不知道为什么它不能与 facade class 和 SQL 服务器一起工作,但同样适用于 MySQL 数据库。