我试图通过提供完全限定的名称从 db 选择特定列到复合类 DTO 中。
@Data
public class Temp {
String dName;
Temp2 value;
public Temp( String dName, Temp2 value) {
this.dName = dName;
this.value = value;
}
@Data
public static class Temp2 {
Integer day;
public Temp2(Integer day) {
this.day = day;
}
}
}
查询: SELECT new com.pojo.Temp ( t1.displayName, new
com.pojo.Temp.Temp2 (t3.day)) FROM table1 t1 JOIN table2 t2 ON t1.bId
= t2.id 并左连接 table3 t3 ON t1.g_id = t2.id
Error: `[2018-11-06 12:02:54] [main] ERROR o.h.hql.internal.ast.ErrorCounter.reportError - [ ] line 1:64: unexpected token: ,
[2018-11-06 12:02:54] [main] ERROR o.h.hql.internal.ast.ErrorCounter.reportError - [ ] line 1:64: unexpected token: ,
antlr.NoViableAltException: unexpected token: ,
at org.hibernate.hql.internal.antlr.HqlBaseParser.primaryExpression(HqlBaseParser.java:1009)
at org.hibernate.hql.internal.antlr.HqlBaseParser.atom(HqlBaseParser.java:3549)
at org.hibernate.hql.internal.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3401)
at org.hibernate.hql.internal.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:3273)
at org.hibernate.hql.internal.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:2930)
at org.hibernate.hql.internal.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:615)
at org.hibernate.hql.internal.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2697)
at org.hibernate.hql.internal.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2558)
at org.hibernate.hql.internal.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2522)
at org.hibernate.hql.internal.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2438)
at org.hibernate.hql.internal.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:2403)
at org.hibernate.hql.internal.antlr.HqlBaseParser.expression(HqlBaseParser.java:2116)
at org.hibernate.hql.internal.antlr.HqlBaseParser.aliasedExpression(HqlBaseParser.java:2357)
at org.hibernate.hql.internal.antlr.HqlBaseParser.selectedPropertiesList(HqlBaseParser.java:1390)
at org.hibernate.hql.internal.antlr.HqlBaseParser.newExpression(HqlBaseParser.java:1434)
at org.hibernate.hql.internal.antlr.HqlBaseParser.selectClause(HqlBaseParser.java:1306)
at org.hibernate.hql.internal.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1040)
at org.hibernate.hql.internal.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:748)
at org.hibernate.hql.internal.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:319)
at org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:198)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:284)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:186)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:141)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153)
at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:553)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:662)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:103)
`
我无法找到使用 jpql 表达式将数据获取到复合类 dto 的任何相关答案。由于我是新人,我可能会遗漏一些东西。
任何善意的帮助将不胜感激。
AFAIK 像这样嵌套构造函数表达式是不可能的。据我所知,有一种方法可以做到这一点,但这是一种又脏又丑的方法。我将所有参数放入一个构造函数中,然后在构造函数中实例化其他类对象。
Example:
public CommentDTO(Long id, String body, LocalDateTime datePosted,
LocalDateTime lastModifiedDate, Long userId,
String login, String avatarUrl, boolean hireable) {
this.id = id;
this.body = body;
this.datePosted = datePosted;
this.lastModifiedDate = lastModifiedDate;
this.author = new UserDTO(userId, login, avatarUrl, hireable);
因此 JPQL 查询必须具有所有这些参数。
再次强调,不建议这样做,因为它变得 100% 不可维护。但这是我发现使用构造函数表达式执行此操作的唯一方法。
我只是重构为使用基于界面的投影。如果您使用 Spring Data JPA,则将其设置为嵌套投影非常容易。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)