我正在编写一条跨三个表连接的JPQL查询。在我的结果列表中,我希望每个匹配行返回三个实体(希望这样说得清楚)。
有什么想法吗?
Hibernate 3.x 是我的JPA提供程序。
据我所知,您可以执行 SELECT o1, o2, o3 FROM EntityA o1, EntityB o2, EntityC o3 WHERE ....
,结果将是一个 List<Object[3]>
,其中数组内容将包含o1、o2、o3的值。
这是一个Spring Data的示例,然而它在JPA中的工作方式相同。
//HQL query
@Query("SELECT c,l,p,u FROM Course c, Lesson l, Progress p, User u "
+ "WHERE c.id=l.courseId AND l.id = p.lessonId AND p.userId = u.id AND u.id=:userId AND c.id=:courseId")
public List<Object[]> getLessonsWithProgress(@Param("userId") Integer userId, @Param("courseId")Integer courseId);
然后,我调用这个方法并打印结果:
List<Object[]> lst = courseRepository.getLessonsWithProgress(userId, courseId);
for (Object o[] : lst) {
Course c = (Course) o[0];
Lesson l = (Lesson) o[1];
Progress p = (Progress) o[2];
User u = (User) o[3];
//all the classes: Course, Lesson, Progress and User have the toString() overridden with the database ID;
System.out.printf("\nUser: %s \n Lesson: %s \n Progress: %s \n Course: %s",u,l,p,c);
}
这里是@Test的输出:
User: com.cassio.dao.model.User[ id=1965 ]
Lesson: com.cassio.dao.model.Lesson[ id=109 ]
Progress: com.cassio.dao.model.Progress[ id=10652 ]
Course: com.cassio.dao.model.Course[ id=30 ]
干杯
如果存在一对多或多对一的关系,如何获取一个实体的多个记录?比如说A是一个实体,B是另一个实体,它们之间有一对多的关系,当你获得结果时,你希望B有一个记录,而A有多个记录。下面是我的查询语句,但我不知道该如何获取第二个实体的多个记录:
最初的回答:
如果您想获取与一个实体相关联的多个记录,可以使用JOIN语句。在您的情况下,您需要使用LEFT JOIN来检索所有A的记录,即使没有匹配的B记录。
您的查询可能如下所示:
SELECT A.*, B.*
FROM A
LEFT JOIN B ON A.id = B.a_id
WHERE A.id = [your_id]
这将返回所有与A.id匹配的B记录和所有A记录。
@Query("SELECT wl, gr FROM WatchList as wl, GeozoneReference gr " +
"WHERE wl.watchlistId = gr.objWatchList.watchlistId " +
"AND wl.watchlistId =:watchlistId")
List<Object[]> findWatchlistByWatchlistId(@Param("watchlistId") Long watchlistId);
由于您正在询问JPA:返回多个实体的查询
,EclipseLink也属于其中。我通过谷歌搜索到了这个问题。以下是我的解决方案。希望对您有用。
TypedQuery<Object[]> query = entityManager.createQuery("select p from Post p where p.publisher.pubId= :ID order by p.createdAt desc",
Object[].class);
query.setParameter("ID", publisherID);
然后您可以循环遍历结果对象并相应地进行类型转换。
for (Object result : query.getResultList()) {
myList.add((Post) result);
}
您也可以尝试这个方法,
Query query = entityManager.createQuery("select p from Post p where p.publisher.pubId= :ID order by p.createdAt desc");
Reference:http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL
select new Foo(o1, o2, o3)...
而得到一个 List<Foo> 而不是一个 List<Object[]>。 - Ryan Stewart