如何使用@SqlResultSetMapping将一对多的本地查询结果映射到POJO类中?

9

我正在使用Java和MySql构建后端API,尝试在JPA 2.1中使用@SqlResultSetMapping将一对多的本地查询结果映射到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")

这是我的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")

                                    }
                              )

            })

这里是POJO类的实现:(我只删除了构造函数和getter/setter)

MiniUser类

public class MiniUser {

    String id;
    String religionId;
    Gender gender;
    List<MiniUserAnswer> answers;
    String name;
    String city_id;
}

还有MiniUserAnswer类

public class MiniUserAnswer {

    String questionId;
    String answerId;
}

我的目标是执行此查询并返回MiniUser列表,在每个MiniUser中:他的“answers”列表,这是一个MiniUserAnswer的列表。

运行此代码后,我得到了以下错误:

The column result [answers] was not found in the results of the query.

我知道原因在于查询选择语句中没有“answers”字段。
那么,我怎样才能实现这样的结果,并考虑性能?答案列表可能会有100个之多。
非常感谢您的帮助,提前致谢!

1
请问有人能回答吗?我在想的做法可行吗? - Tamer Saleh
1个回答

0
查询语句 "SELECT DISTINCT t1.ID, t1.RELIGION_ID t1.gender, t1.NAME, t1.CITY_ID, t2.question_id, t2.answer_id" 中没有返回名为 answers 的参数。 要获得您想要的结果,我建议使用以下方法: 选项1(条件构建器)
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<UserTableEntity> cq = cb.createQuery(UserTableEntity.class);
Root<UserTableEntity> rootUserTable = cq.from(UserTableEntity.class);
Join<UserTableEntity,UserAnswerTableEntity> joinAnswerTable = rootUserTable.join(rootUserTable_.id) // if the relationship is defined as lazy, use "fetch" instead of "join"
//cq.where() NO WHERE CLAUSE
cq.select(rootUserTable)

entityManager.createQuery(cq).getResultList();

选项2(命名查询,非本地)

@NamedQuery(name = "User.getAll", query = "SELECT t1 FROM UserTableEntityt1 join fetch t1.answers)

选项3(实体子图,在JPA 2.1中新增)

在用户实体类中:

@NamedEntityGraphs({
    @NamedEntityGraph(name = "graph.User.Answers", attributeNodes = @NamedAttributeNode("answers"))
})

在DAO中,在实体管理器中设置提示:
EntityGraph graph = this.em.getEntityGraph("graph.User.Answers");

Map hints = new HashMap();
hints.put("javax.persistence.fetchgraph", graph);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接