Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate/JPA将本机查询结果映射到非实体持有实体_Java_Hibernate_Jpa_Orm - Fatal编程技术网

Java Hibernate/JPA将本机查询结果映射到非实体持有实体

Java Hibernate/JPA将本机查询结果映射到非实体持有实体,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,我有3个实体,希望交叉连接它们。因为我不需要为此创建新实体,所以我只想通过使用本机查询获取来映射: EntityA{ ... String someValue; } EntityB{ ... String someValue; } EntityC{ ... String someValue; } 以及交叉连接的对象 CrossJoinedFoo{ EntityA entityA; EntityB entityB; En

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

EntityA{
    ...
    String someValue;
}

EntityB{
    ...
    String someValue;
}

EntityC{
    ...
    String someValue;
}
以及交叉连接的对象

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");

如何实现此行为?

您可以进行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();
私有静态最终字符串\u选择\u交叉\u连接\u实体=
从中选择新的my.package.CrossJoinedFoo(a、b、c)
+“实体a”
+ ", "
+“实体b”
+ ", "
+“EntityC”
+“其中(1=1)”
+和“+”a.someValue=:someValue”
+和“+”b.someValue=:someValue”
+和“+”c.someValue=:someValue”;
Query Query=entityManager.createQuery(\u选择\u交叉\u连接\u实体);
setParameter(“:someValue”,“foo”);
列表结果=query.List();

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

使用


请注意,生成的实体不会是更简单的方法:)+1但是您丢失了类型安全性为什么要丢失类型安全性?因为生成的类的名称在查询字符串中,因此不会被compiler@Code.It请注意,这种方法使用JPQL查询,因此将对结果实体进行管理使用本机sql查询时,情况并非如此。如果您没有得到结果,请选择这个答案而不是我的答案,因为我只是出于只读目的使用它们,我不关心托管状态:D