java—关联实体和非关联实体之间的连接,导致jpql中的非持久实体使用延迟获取不断抛出jpqlsyntaxexception

uidvcgyl  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(299)

这个查询不断地给我带来不同的错误,我怀疑我对构建jpql查询的理解。
请帮我找出它的毛病。
我尝试在直接关联的实体和间接关联的实体之间连接,并在非持久性dto中获得结果。

public List leaveRequestsReport(List employeesGroupIds) {
    if(employeesGroupIds!=null && employeesGroupIds.size()==0) 
        employeesGroupIds =null; 
    return persistence.getEntityManager().
        createQuery("select new com.company.vp.workflow.LeaveRequestRow(at.requestState.request.requestNumber, " 
        + "e.employeeNumber, e.fullName, at.requestState.request.submissionDate, e.employeesGroup.name, at.requestState.request.states) " + " from vp$RequestStateAttribute at "
        + " INNER JOIN at.requestState INNER JOIN at.requestState.request , "
        + " vp$Employee e INNER JOIN e.employeesGroup "
        + " where at.requestState.request.subjectType = 10 " 
        + " and at.requestState.request.requestKind = 20 " )
        .getResultList();
}

我得到的例外

com.haulmont.cuba.core.sys.jpql.JpqlSyntaxException: Errors found for input JPQL:[select new com.company.vp.workflow.LeaveRequestRow(at.requestState.request.requestNumber, e.employeeNumber, e.fullName, at.requestState.request.submissionDate, e.employeesGroup.name, at.requestState.request.states)  from vp$RequestStateAttribute at  INNER JOIN at.requestState INNER JOIN at.requestState.request ,  vp$Employee e INNER JOIN e.employeesGroup  where at.requestState.request.subjectType = 10  and at.requestState.request.requestKind = 20]
No variable name found [Join variable: null]
No variable name found [Join variable: null]
No variable name found [Join variable: null]    
at com.haulmont.cuba.core.global.QueryParserAstBased.getTree(QueryParserAstBased.java:76) ~[cuba-global-7.2.6.jar:7.2.6]    
at com.haulmont.cuba.core.global.QueryParserAstBased.getAnalyzer(QueryParserAstBased.java:84) ~[cuba-global-7.2.6.jar:7.2.6]    
at com.haulmont.cuba.core.global.QueryParserAstBased.getEntityName(QueryParserAstBased.java:101) ~[cuba-global-7.2.6.jar:7.2.6]    
at com.haulmont.cuba.core.sys.QueryImpl.transformQueryString(QueryImpl.java:247) ~[cuba-core-7.2.6.jar:7.2.6]    
at com.haulmont.cuba.core.sys.QueryImpl.getQuery(QueryImpl.java:134) ~[cuba-core-7.2.6.jar:7.2.6]    
at com.haulmont.cuba.core.sys.QueryImpl.getResultList(QueryImpl.java:409) ~[cuba-core-7.2.6.jar:7.2.6]

实体如下//Map是一个100%正常工作的过程

@Table(name = "VP_REQUEST_STATE")
@Entity(name = "vp$RequestState")
public class RequestState extends BaseUuidEntity implements AttributeHolder {
private static final long serialVersionUID = 6052950589685024134L; @OnDeleteInverse(DeletePolicy.CASCADE)

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "REQUEST_ID")
protected Request request;  

@Composition
@OneToMany(mappedBy = "requestState")
protected List requestStateAttributes; 
// setters and getters go here 
}
@Table(name = "VP_REQUEST_STATE_ATTRIBUTE")
@Entity(name = "vp$RequestStateAttribute")
public class RequestStateAttribute extends BaseUuidEntity implements Creatable, ValuedAttributable {
private static final long serialVersionUID = 7406123321282514785L;

@OnDeleteInverse(DeletePolicy.CASCADE)
@NotNull
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "REQUEST_STATE_ID")
protected RequestState requestState;

//other non related attribute and getter and setters go here 
}
@Table(name = "VP_REQUEST")
@Entity(name = "vp$Request")
public class Request extends BaseUuidEntity {
private static final long serialVersionUID = 7073994286444570051L;
@Column(name = "REQUEST_NUMBER")
protected String requestNumber;
@Column(name = "REQUEST_KIND")
protected Integer requestKind;

@Column(name = "SUBJECT_TYPE")
protected Integer subjectType;

@Column(name = "SUBJECT_ID")
protected UUID subjectId;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "SUBMISSION_DATE")
protected Date submissionDate;

@Composition
@OneToMany(mappedBy = "request")
protected List states;

//other non related attributes and setters and getters go here.
}
sycxhyv7

sycxhyv71#

这是我做的另一个试验,我得到了一个不同的例外

public List leaveRequestsReport(List employeesGroupIds) {
if(employeesGroupIds!=null && employeesGroupIds.size()==0) 
employeesGroupIds =null; 
return persistence.getEntityManager().
   createQuery("select new com.company.vp.workflow.LeaveRequestRow(rq.requestNumber, " 
 + "e.employeeNumber, e.fullName, rq.submissionDate, eg.name, rq.states) " 
 + " from vp$RequestStateAttribute at " 
 + " INNER JOIN at.requestState st INNER JOIN at.requestState.request rq, "
 + " vp$Employee e INNER JOIN e.employeesGroup eg"
 + " where rq.subjectType = 10 " 
 + " and rq.requestKind = 20 " ) 
.getResultList();

}

我得到的例外是

java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager:Exception Description: 
Problem compiling [select new com.company.vp.workflow.LeaveRequestRow(rq.requestNumber, e.employeeNumber, e.fullName, rq.submissionDate, eg.name, rq.states)  from vp$RequestStateAttribute at INNER JOIN at.requestState st INNER JOIN at.requestState.request rq,  vp$Employee e INNER JOIN e.employeesGroup eg where rq.subjectType = 10  and rq.requestKind = 20 ].[127, 136] The state field path 'rq.states' cannot be resolved to a collection type.    
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1750) ~[org.eclipse.persistence.jpa-2.7.3-7-cuba.jar:na]    
at com.haulmont.cuba.core.sys.QueryImpl.buildJPAQuery(QueryImpl.java:229) ~[cuba-core-7.2.6.jar:7.2.6]    
at com.haulmont.cuba.core.sys.QueryImpl.getQuery(QueryImpl.java:138) ~[cuba-core-7.2.6.jar:7.2.6]    
at com.haulmont.cuba.core.sys.QueryImpl.getResultList(QueryImpl.java:409) ~[cuba-core-7.2.6.jar:7.2.6]

相关问题