首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JPAQuery (QueryDSL)中的非致命用户错误

JPAQuery (QueryDSL)中的非致命用户错误
EN

Stack Overflow用户
提问于 2015-02-04 13:06:16
回答 1查看 509关注 0票数 1

我必须使用QueryDSL / JPAQuery添加一个搜索函数。搜索应该使用一个由父ids组成的表:

代码语言:javascript
运行
复制
ID   LABEL  P_ID
1    A      null 
2    AB     1
3    ABC    2

一个简单的SQL语句给出了正确的结果:

代码语言:javascript
运行
复制
SELECT * FROM ACT
JOIN ORG DEPT ON ACT.ORGID = DEPT.ID
JOIN ORG DEPT2 ON DEPT.P_ID = DEPT2.ID
WHERE DEPT.P_ID = 123

我面临的问题是,我必须使用现有的查询对象创建相应的QueryDSL / JPAQuery。

我的代码是:

代码语言:javascript
运行
复制
query.join(act.org, dept).on(act.org.id.eq(dept.id)).where(dept.org.parent.eq(123));

在查询之前和之后,其他语句修改查询对象。这将导致错误:

调试JPAQuery -从档案中选择计数(区分dossier_),左加入dossier_.acties actie_内部连接actie_.organisatieStructuur organisatieStructuur_ on actie_.organisatieStructuur.id = organisatieStructuur_.id,其中dossier_.deleted = ?1,organisatieStructuur_.ouder = ?2

org.apache.openjpa.persistence.ArgumentException:在字符64处遇到"on“,但期望:”、“、”组“、”具有“、”内部“、”连接“、”左“、”顺序“、”哪里",。在解析JPQL时,“从dossier_选择计数(Distinct dossier_),左加入dossier_.acties actie_内部连接actie_.organisatieStructuur.id = organisatieStructuur_.id上的actie_.organisatieStructuur organisatieStructuur_,其中dossier_.deleted = ?1,organisatieStructuur_.ouder = ?2”。

添加了9-Feb:域模型(只显示了包含字段的第一部分,其他由于大小而没有显示的getter/setter方法):

代码语言:javascript
运行
复制
@Entity
public class Dossier extends AbstractEntity implements Serializable, HasCommunicaties {
private static final String SHAREPOINT_NR_FORMAT = "{0,number,0000}/{1,number,00}";

@Version
private long version;

private int jaar;
private int volgNummer;

private Status status;

public enum Status {
    OPEN, AFGESLOTEN;
}

@Temporal(TemporalType.TIMESTAMP)
private Date datumStatus;

@NotNull
@Column(length = 5000)
@Size(max = 5000)
private String beschrijvingVaststelling;
@Column(length = 5000)
@Size(max = 5000)
private String oorzaakVaststelling;

@ManyToOne
private ZorgDomein zorgDomein;
@ManyToOne(fetch = FetchType.LAZY)
@NotNull
private Bron bron;

@ManyToOne
private KernWaarde kernWaarde;

private String pdca;

@Valid
@OneToMany(mappedBy = "dossier", cascade = CascadeType.ALL, orphanRemoval = true)
@Size(min = 1)
private List<PlaatsVaststelling> plaatsVaststellingen = new ArrayList<PlaatsVaststelling>();

@ManyToOne(fetch = FetchType.LAZY)
private Proces proces;
@NotNull
private String beheerder;
@Temporal(TemporalType.DATE)
@Past
private Date datumVaststelling;
@ManyToOne(fetch = FetchType.LAZY)
private TypeVaststelling typeVaststelling;
@ManyToOne(fetch = FetchType.LAZY)
private Prioritering prioritering;
@ManyToOne(fetch = FetchType.LAZY)
private AuditRapport auditRapport;

@OneToMany(mappedBy = "dossier", cascade = CascadeType.ALL)
@OrderBy("volgnummer")
@Valid
private List<Actie> acties = new ArrayList<Actie>();
@OneToMany(mappedBy = "dossier")
@OrderBy("datum desc")
private List<Communicatie> communicaties = new ArrayList<Communicatie>();
@OneToMany(mappedBy = "dossier", cascade = CascadeType.ALL)
@OrderBy("datum desc")
private List<Historiek> historieks = new ArrayList<Historiek>();

private boolean vertrouwelijk;
@ElementCollection
private List<String> beheerders = new ArrayList<String>();
@ElementCollection
private List<String> lezers = new ArrayList<String>();

private boolean mailPVAVerstuurd;
private Date datumAanpakTegen;


private boolean deleted;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-09 20:13:34

此SQL

代码语言:javascript
运行
复制
SELECT * FROM ACT
JOIN ORG DEPT ON ACT.ORGID = DEPT.ID
JOIN ORG DEPT2 ON DEPT.P_ID = DEPT2.ID
WHERE DEPT.P_ID = 123

可以通过

代码语言:javascript
运行
复制
QAct act = QAct.act;
QOrg dept = new QOrg("dept");
QOrg dept2 = new QOrg("dept2");
query.from(act)
     .join(act.org, dept)
     .join(dept.p, dept2)
     .where(dept2.p.id.eq(123))
     .list(act);

我不知道如何将SQL映射到域模型,这就是为什么我使用了接近SQL关系的实体名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28322184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档