NativeQuery Spring 数据 return 对象
NativeQuery Spring Data return object
我需要在 Spring 数据中实现这样的查询:-
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
(如果我在这里错了请纠正我)
因此我的存储库方法如下所示:-
@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
class 看起来像这样:-
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: Failed to
convert from type [java.lang.Object[]] to type
[com.mycomp.MyObj] for value '{TEST, 5.0}'; nested
exception is
org.springframework.core.convert.ConverterNotFoundException: No
converter found capable of converting from type [java.lang.String] to
type [com.mycomp.dto.MyObj]
我需要一种方法来 return 结果为 MyObj
。 (或者至少是一种将其转换为 MyObj 的方法)这可能吗?
编辑:
根据@Cepr0 的回答构建我的实体class 看起来像这样:-
@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 查询应该是什么样子...
查询通过对象数组返回您存储在普通 object.Iterate 中的对象数组,并将其设置为如下所示的对象
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);
}
只需使用Projection and 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();
此查询可能不完全符合您的需要,因为我不知道您实体的结构 类。但是如果你给他们看我会更正查询...
我实际上遇到了与此异常类似的问题。我有 3 个 table:Project、Asset 和 ProjectAsset。 ProjectAsset 是参考 table,其中一个项目可以有许多资产。所以我创建了 3 个存储库,每个实体一个。问题是我将 @Query 放在了 ProjectAssetRepository 中,但由于存储库扩展了 CrudRepository 而无法正常工作。 ProjectAssetId 是由projectid 和assetid 组成的嵌入式id。我不能只是这个存储库中的 return Asset 对象,所以我将该方法移至 AssetRepository 并且一切正常。如果您正在使用交叉引用 tables,请确保您拉取了正确的对象,否则您将 运行 进入此异常。
我需要在 Spring 数据中实现这样的查询:-
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
(如果我在这里错了请纠正我)
因此我的存储库方法如下所示:-
@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
class 看起来像这样:-
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: Failed to convert from type [java.lang.Object[]] to type [com.mycomp.MyObj] for value '{TEST, 5.0}'; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.String] to type [com.mycomp.dto.MyObj]
我需要一种方法来 return 结果为 MyObj
。 (或者至少是一种将其转换为 MyObj 的方法)这可能吗?
编辑:
根据@Cepr0 的回答构建我的实体class 看起来像这样:-
@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 查询应该是什么样子...
查询通过对象数组返回您存储在普通 object.Iterate 中的对象数组,并将其设置为如下所示的对象
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);
}
只需使用Projection and 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();
此查询可能不完全符合您的需要,因为我不知道您实体的结构 类。但是如果你给他们看我会更正查询...
我实际上遇到了与此异常类似的问题。我有 3 个 table:Project、Asset 和 ProjectAsset。 ProjectAsset 是参考 table,其中一个项目可以有许多资产。所以我创建了 3 个存储库,每个实体一个。问题是我将 @Query 放在了 ProjectAssetRepository 中,但由于存储库扩展了 CrudRepository 而无法正常工作。 ProjectAssetId 是由projectid 和assetid 组成的嵌入式id。我不能只是这个存储库中的 return Asset 对象,所以我将该方法移至 AssetRepository 并且一切正常。如果您正在使用交叉引用 tables,请确保您拉取了正确的对象,否则您将 运行 进入此异常。