首页 > 解决方案 > Hibernate/JPA 将本机查询的结果映射到非实体持有实体

问题描述

我确实有 3 个实体并想交叉加入它们。因为我不需要为此创建一个新实体,所以我只想通过使用本机查询获取来映射:

EntityA{
    ...
    String someValue;
}

EntityB{
    ...
    String someValue;
}

EntityC{
    ...
    String someValue;
}

和 CrossJoined 对象

CrossJoinedFoo{
    EntityA entityA;
    EntityB entityB;
    EntityC entityC;
}

我像这样使用它:

private static final String _SELECT_CROSS_JOIN_ENTITIES = "SELECT * FROM "
            + "EntityA"
            + ", "
            + "EntityB"
            + ", "
            + "EntityC"
            + " WHERE (1=1) "
            + " AND " + "EntityA.someValue = :someValue"
            + " AND " + "EntityB.someValue = :someValue"
            + " AND " + "EntityC.someValue = :someValue";

Query query = entityManager.createNativeQuery(_SELECT_CROSS_JOIN_ENTITIES);
query.setParameter(":someValue", "foo");

我怎样才能实现这种行为?

标签: javahibernatejpaorm

解决方案


您可以进行 HQL 查询并使用结果类策略。只需记住向 CrossJoinedFoo 添加一个构造函数,以适当的顺序接受 3 个实体:

private static final String _SELECT_CROSS_JOIN_ENTITIES = 
            "SELECT new my.package.CrossJoinedFoo(a,b,c) FROM "
            + "EntityA a"
            + ", "
            + "EntityB b"
            + ", "
            + "EntityC c"
            + " WHERE (1=1) "
            + " AND " + "a.someValue = :someValue"
            + " AND " + "b.someValue = :someValue"
            + " AND " + "c.someValue = :someValue";

Query query = entityManager.createQuery(_SELECT_CROSS_JOIN_ENTITIES);
query.setParameter(":someValue", "foo");

List<CrossJoinedFoo> result = query.list();

请记住将包装更改为适当的包装。


推荐阅读