【发布时间】:2017-11-10 04:51:12
【问题描述】:
我需要像这样在 Spring Data 中实现一个查询:-
Select User.name, sum(Activity.minutes)
From User, Activity, ActivityStatus
Where User.id = ActivityStatus.userId
And Activity.id = ActivityStatus.activityId
AND ActivityStatus = "COMPLETED"
GROUP BY user.name;
所以我需要加入 3 个表,因此我必须使用 @Query 和 nativeQuery = true(如果我在这里错了,请纠正我)
所以我的 Repository 方法看起来像这样:-
@Query(value = "Select User.name, sum(Activity.minutes) as total_minutes
From User, Activity, ActivityStatus
Where User.id = ActivityStatus.userId
And Activity.id = ActivityStatus.activityId
AND ActivityStatus = "COMPLETED"
AND User.Type = ?1
GROUP BY user.name;",
nativeQuery = true
)
List<MyObj> getTotalActivityMinutesByUserType(String userType);
MyObj 类看起来像这样:-
public class MyObj {
String name;
long total_minutes;
// getter and setter methods
public MyObj(String name, long total_minutes) {
this.name = name;
this.total_minutes = total_minutes;
}
}
我的测试方法:-
@Test
public void TotalActivityTest() throws Exception {
List<MyObj> objA = myRepository.getTotalActivityMinutesByUser("TEST");
}
我得到以下异常:-
org.springframework.core.convert.ConversionFailedException: 失败 从类型 [java.lang.Object[]] 转换为类型 [com.mycomp.MyObj] 为值'{TEST,5.0}';嵌套的 例外是 org.springframework.core.convert.ConverterNotFoundException:否 发现转换器能够从类型 [java.lang.String] 转换为 输入 [com.mycomp.dto.MyObj]
我需要一种将结果返回为MyObj 的方法。 (或者至少是一种将其转换为 MyObj 的方法)这可能吗?
编辑:
根据@Cepr0 的回答构建我的实体类如下所示:-
@Entity
public class ActivityStatus extends Base {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH})
private Activity activity;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH})
private User user;
}
我不确定 JPQL 中的 JOIN 查询应该是什么样子...
【问题讨论】:
-
您是否像 sqldeveloper 一样在 db ui 中执行了此查询,因为您在哪里使用连接来建立关系?
-
是的,查询没有问题。从异常中您可以观察到结果是 {TEST,5.0} 这正是我在工作台上运行查询得到的结果。问题在于将结果集映射到 MyObj。
-
查询返回对象数组,您将其存储在对象中。遍历对象数组并将其设置为对象
标签: java jpa spring-data nativequery