我需要在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 []]转换为type [com.mycomp.MyObj] for value&#39; {TEST,5.0}&#39;嵌套 例外是 org.springframework.core.convert.ConverterNotFoundException:没有 转换器发现能够从类型[java.lang.String]转换为 输入[com.mycomp.dto.MyObj]
我需要一种方法将结果作为MyObj
返回。 (或者至少是将它投射到MyObj的方法)这可能吗?
编辑:
从@ Cepr0建立答案My Entity类如下所示: -
@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查询应该如何......
答案 0 :(得分:10)
只需使用Projection和JPQL查询:
public interface NameAndDuration {
String getName();
Long getDuaration();
}
@Query("select u.name as name, sum(a.minutes) as duration from User u join u.activityStatus st join st.activity a where st.status = "COMPLETED" and u.type = ?1 group by u.name")
List<NameAndDuration> getNameAndDurationByUserType(String userType);
List<NameAndDuration> list = getNameAndDurationByUserType("TEST");
String userName = list.get(0).getName();
此查询可能不完全符合您的要求,因为我不知道您的实体类的结构。但是如果你展示它们我将更正查询......
答案 1 :(得分:1)
查询返回正在存储在普通对象中的对象数组。通过对象数组迭代并将其设置为对象,如下所示
List<MyObj > test= new ArrayList<>();
List<Object[]> rows= query.list();
for (Object[] row : rows) {
MyObj temp=new MyObj (arg1,arg2);
temp.set((Dataype) row[0])//You need to create getters and setters for your pojo
..
test.add(temp);
}
答案 2 :(得分:0)
我实际上有一个类似的问题,只是这个例外。我有3个表格:Project,Asset和ProjectAsset。 ProjectAsset是一个项目可以拥有许多资产的参考表。因此,我创建了3个存储库,每个实体一个。问题是我将我的@Query放在ProjectAssetRepository中,但由于存储库扩展了CrudRepository而无法正常工作。 ProjectAssetId是由projectid和assetid组成的嵌入式ID。我不能只在此存储库中返回Asset对象,因此将方法移至AssetRepository,一切正常。如果使用交叉引用表,请确保提取正确的对象,否则将遇到此异常。