Tam*_*leh 8 one-to-many sqlresultsetmapping nativequery jpa-2.1
我正在使用Java和MySql在后端API中工作,我正在尝试在JPA 2.1中使用@SqlResultSetMapping将ONE-TO-MANY本机查询结果映射到POJO类,这是本机查询:
@NamedNativeQuery(name = "User.getAll”, query = "SELECT DISTINCT t1.ID, t1.RELIGION_ID t1.gender,t1.NAME,t1.CITY_ID , t2.question_id, t2.answer_id FROM user_table t1 inner join user_answer_table t2 on t1.ID = t2.User_ID“,resultSetMapping="userMapping")
Run Code Online (Sandbox Code Playgroud)
而且,这是我的结果SQL映射:
@SqlResultSetMapping(
name = "userMapping",
classes = {
@ConstructorResult(
targetClass = MiniUser.class,
columns = {
@ColumnResult(name = "id"),
@ColumnResult(name = "religion_id"),
@ColumnResult(name = "gender"),
@ColumnResult(name = "answers"),
@ColumnResult(name = "name"),
@ColumnResult(name = "city_id")
}
),
@ConstructorResult(
targetClass = MiniUserAnswer.class,
columns = {
@ColumnResult(name = "question_id"),
@ColumnResult(name = "answer_id")
}
)
})
Run Code Online (Sandbox Code Playgroud)
而且,这是POJO类的实现:(我刚刚删除了构造函数和getter/setter)
MiniUser类
public class MiniUser {
String id;
String religionId;
Gender gender;
List<MiniUserAnswer> answers;
String name;
String city_id;
}
Run Code Online (Sandbox Code Playgroud)
和MiniUserAnswer类
public class MiniUserAnswer {
String questionId;
String answerId;
}
Run Code Online (Sandbox Code Playgroud)
我的目标是执行此查询并返回一个列表MiniUser,并在每个MiniUser中:列出他的"答案",这是一个列表MiniUserAnswer.
运行此代码后,我收到此错误:
The column result [answers] was not found in the results of the query.
Run Code Online (Sandbox Code Playgroud)
我知道为什么,这是因为查询select语句中没有"answers"字段.
那么,考虑到性能,我怎样才能完成这样的事情呢?这个答案列表可能达到100.
我非常感谢您的帮助,提前致谢!
查询“SELECT DISTINCT t1.ID, t1.RELIGION_ID t1.gender, t1.NAME, t1.CITY_ID, t2.question_id, t2.answer_id”不会返回名为answers的参数。\n要获取您正在查找的结果,我会使用:
\n\n选项 1(标准生成器)
\n\nCriteriaBuilder cb = entityManager.getCriteriaBuilder();\nCriteriaQuery<UserTableEntity> cq = cb.createQuery(UserTableEntity.class);\nRoot<UserTableEntity> rootUserTable = cq.from(UserTableEntity.class);\nJoin<UserTableEntity,UserAnswerTableEntity> joinAnswerTable = rootUserTable.join(rootUserTable_.id) // if the relationship is defined as lazy, use "fetch" instead of "join"\n//cq.where() NO WHERE CLAUSE\ncq.select(rootUserTable)\n\nentityManager.createQuery(cq).getResultList();\nRun Code Online (Sandbox Code Playgroud)\n\n选项 2(命名查询,非本机)
\n\n@NamedQuery(name = "User.getAll\xe2\x80\x9d, query = "从 UserTableEntityt1 中选择 t1 join 获取 t1.answers)
\n\n选项 3(实体子图,JPA 2.1 中的新增功能)
\n\n在用户实体类中:
\n\n@NamedEntityGraphs({\n @NamedEntityGraph(name = "graph.User.Answers", attributeNodes = @NamedAttributeNode("answers"))\n})\nRun Code Online (Sandbox Code Playgroud)\n\n在 DAO 中实体管理器中设置提示:
\n\nEntityGraph graph = this.em.getEntityGraph("graph.User.Answers");\n\nMap hints = new HashMap();\nhints.put("javax.persistence.fetchgraph", graph);\nRun Code Online (Sandbox Code Playgroud)\n