簡體   English   中英

關聯實體和非關聯實體之間的連接,導致在 JPQL 中使用 Lazy fetch 生成非持久實體不斷拋出 JpqlSyntaxException

[英]Join between associated and non associated entities, result into non persistent entity in JPQL with Lazy fetch keeps throwing JpqlSyntaxException

這個查詢不斷給我不同的錯誤,我懷疑我對構建 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]

實體如下 // 映射是 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.
}

這是我做的另一次試驗,我得到了一個不同的例外

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM