首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将ElementCollection注释属性中的内容读入值对象属性

将ElementCollection注释属性中的内容读入值对象属性
EN

Stack Overflow用户
提问于 2018-01-15 11:44:53
回答 1查看 251关注 0票数 0

当尝试将JPA @ElementCollection的内容读入值对象时出现异常。

标准代码(我不使用预先生成的元模型):

代码语言:javascript
运行
复制
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<KursplanListDTO> cq = cb.createQuery(KursplanListDTO.class);
Metamodel m = em.getMetamodel();
EntityType<Kursplan> Kursplan_ = m.entity(Kursplan.class);
EntityType<Institution> Institution_ = m.entity(Institution.class);
Root<Kursplan> kursplan = cq.from(Kursplan.class);
cq.multiselect(kursplan.get("id"), kursplan.get("name"), kursplan.get("institution"), kursplan.get("participants"));
TypedQuery<KursplanListDTO> tq = em.createQuery(cq);
List<KursplanListDTO> result = tq.getResultList();

实体(“Kursplan”):

代码语言:javascript
运行
复制
...
@NotNull
private String name;

@NotNull
@ManyToOne(fetch = FetchType.EAGER)
private Institution institution

@ElementCollection(targetClass = String.class, fetch = FetchType.EAGER)
@Column(name = "participants")
private List<String> participants = new ArrayList<>();
...

DTO (KursplanListDTO):

代码语言:javascript
运行
复制
...
public KursplanListDTO(Long id, String name, Institution institution, List<String> participants) {
...
}
...

当我运行上面的代码时,我得到了异常: org.hibernate.hql.internal.ast.QuerySyntaxException: java.lang.IllegalArgumentException:无法在类se.testapp.business.kursplan.entity.KursplanListDTO.上找到合适的构造函数预期的参数是: long,java.lang.String,java.lang.String java.util.Collection

如果我将DTO构造函数中的列表更改为java.util.Collection,则会得到这个异常(从日志):

代码语言:javascript
运行
复制
12:07:22,056 INFO  [stdout] (default task-2) Hibernate: 
12:07:22,056 INFO  [stdout] (default task-2)     /* select
12:07:22,057 INFO  [stdout] (default task-2)         new se.testapp.business.kursplan.entity.KursplanListDTO(generatedAlias0.id,
12:07:22,057 INFO  [stdout] (default task-2)         generatedAlias0.name,
12:07:22,057 INFO  [stdout] (default task-2)         generatedAlias0.institution,
12:07:22,057 INFO  [stdout] (default task-2)         generatedAlias0.participants) 
12:07:22,057 INFO  [stdout] (default task-2)     from
12:07:22,057 INFO  [stdout] (default task-2)         Kursplan as generatedAlias0  */ select
12:07:22,058 INFO  [stdout] (default task-2)             kursplan0_.id as col_0_0_,
12:07:22,058 INFO  [stdout] (default task-2)             kursplan0_.name as col_1_0_,
12:07:22,061 INFO  [stdout] (default task-2)             kursplan0_.institution_id as col_2_0_,
12:07:22,061 INFO  [stdout] (default task-2)             . as col_3_0_ 
12:07:22,061 INFO  [stdout] (default task-2)         from
12:07:22,061 INFO  [stdout] (default task-2)             Kursplan kursplan0_ 
12:07:22,061 INFO  [stdout] (default task-2)         inner join
12:07:22,061 INFO  [stdout] (default task-2)             Institution institutio1_ 
12:07:22,061 INFO  [stdout] (default task-2)                 on kursplan0_.institution_id=institutio1_.id 
12:07:22,061 INFO  [stdout] (default task-2)         inner join
12:07:22,061 INFO  [stdout] (default task-2)             Kursplan_participants participants2_ 
12:07:22,061 INFO  [stdout] (default task-2)                 on kursplan0_.id=participants2_.Kursplan_id 
12:07:22,064 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-2) SQL Error: 156, SQLState: S0001
12:07:22,065 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-2) Incorrect syntax near the keyword 'as'.

很明显,“.”在col_3__上看上去不太对。

如果我忽略了multiselect和DTO构造函数中的“参与者”,它就能工作(其他数据将按其应有的方式读入DTO )。

那么,我能做些什么来制定标准呢?让我将元素集合的内容放入一个值对象(在我的例子中是KursplanListDTO)

Java 8 JPA版本:2.1JPA实现: Hibernate 5

EN

回答 1

Stack Overflow用户

发布于 2018-01-15 20:31:23

查询的结果总是一个表。因此,不可能在构造函数中获得Collection。

规范定义了标识变量,使它们表示实例,而不是集合。

在这里阅读更多信息:https://martinelli.ch/2009/06/02/jpa-constructor-expression-quiz/

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

https://stackoverflow.com/questions/48262340

复制
相关文章

相似问题

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