Hibernate JPA中TypedQuery是否支持嵌套使用多个自定义构造器?
问题解答
可以编写包含嵌套自定义构造器的TypedQuery,JPQL(Java持久化查询语言)原生支持SELECT new语法下的构造器嵌套使用,只要对应类存在匹配的构造方法,即可实现你需求里「同时返回关联id和自定义对象实例」的效果。
核心注意事项
- 所有在构造器中用到的类都必须提供和参数顺序、参数类型完全匹配的公共构造方法:示例中
example.Chapter类需要存在入参为(章节id对应类型、章节size对应类型)的公共构造,ChapterWithBookId类需要存在入参为(图书id对应类型、Chapter类实例)的公共构造,否则运行时会抛出构造方法未找到的异常。 - 你给出的示例代码存在一处笔误:
em.createQuery的第二个返回类型参数写为ChapterWithBookIds.class,多了末尾的s,需要和你要返回的ChapterWithBookId类保持一致,否则会出现类型不匹配错误。 - 构造器传入的字段值类型必须和实体类对应字段的类型完全一致,避免触发不必要的类型转换异常。
修正后的参考代码
TypedQuery<ChapterWithBookId> query = em.createQuery( "SELECT new " + ChapterWithBookId.class.getName() + "(book.id, new example.Chapter(chapter.id, " + "chapter.size" + ")) " + "FROM " + Book.class.getName() + " AS book JOIN " + Chapter.class.getName() + " AS chapter WHERE " + "book.id IN :ids", ChapterWithBookId.class) .setParameter("ids", ids);
内容的提问来源于stack exchange,提问作者lasbr
相关产品推荐
相关产品推荐

