【发布时间】:2018-12-27 05:26:30
【问题描述】:
在 DisabScreenRequest 上执行搜索并获取其子详细信息。使用构造函数表达式和 JPQL 使用 DTO 投影。
具有子表的父实体。
@Entity
@Table(name = "SCREEN_REQUEST")
public class DisabScreenRequest implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private long requestId;
@Column(name = "CIVILID")
private Long civilId;
@ManyToMany()
@JoinTable(name = "_DISAB_SCREEN_REQ_DETAILS", joinColumns = {
@JoinColumn(name = "REQUEST_ID") }, inverseJoinColumns = { @JoinColumn(name = "DISABILTY_TYPE_ID") })
private Set<DisabMaster> disabilities = new HashSet<DisabMaster>();
public DisabScreenRequest() {
}
}
这是残疾表。
@Entity
@Table(name="DISAB_MASTER")
@Immutable
public class DisabMaster implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="DIS_TYPE_ID")
private long disabilityTypeId;
@Column(name="DIS_TYPE_DESC")
private String disTypeDesc;
public DisabMaster() {
super();
}
}
必须获取所有请求以及每个请求的残疾。
搜索 DTO(使用它我还有其他要添加的连接,而不是这里提到的连接)。
public class RequestSearchDto {
private long requestId;
private Long civilId;
private Set<DisabMaster> disabilities;
public RequestSearchDto() {
super();
}
public RequestSearchDto(long requestId, Long civilId) {
super();
this.requestId = requestId;
this.civilId = civilId;
}
public RequestSearchDto(long requestId, Long civilId, Set<DisabMaster> disabilities) {
super();
this.requestId = requestId;
this.civilId = civilId;
this.disabilities = disabilities;
}
}
这是我的 JPQL 查询
public interface ReposJPQL {
public String GET__REQUEST = "SELECT DISTINCT new org.test.RequestSearchDto "
+ "(dsr.requestId, dsr.civilId, dsr.disabilities)"
+ " FROM DisabScreenRequest dsr WHERE 1=1 ";
}
这将得到一个 org.hibernate.exception.SQLGrammarException: 无法提取 ResultSet。
我在这里做错了什么,如何获取子表数据? 如果您需要任何信息,请告诉我
堆栈跟踪:
Caused by: java.sql.SQLException: ORA-00936: missing expression
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:754)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:219)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:813)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1051)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:854)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1156)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3415)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3460)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:60)
【问题讨论】:
-
您应该使用构造函数表达式来完全限定类名。类似 com.xxx.yyy.RequestSearchDto.
-
使用这里提到的类名只是为了便于阅读。该错误与获取列表有关。
-
你能分享异常的整个堆栈跟踪吗?
-
@Dherik 选择不同的 disabsc0_.request_id 作为 col_0_0_,disabsc0_.civilid 作为 col_1_0_,。 as col_2_0_ from disab_screen_request disabsc0 inner join disab_screen_req_details disabiliti1 on disabsc0_.request_id=disabiliti1_.request_id inner join disab_master disabma2 on disabiliti1_.disabilty_type_id=disabma2_.dis_type_id where 1=1 ... 这是生成的查询。第二个参数有问题
-
@Dherik 用完整的堆栈跟踪更新了问题
标签: spring spring-mvc spring-boot spring-data-jpa jpql