首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NativeQuery春季数据返回对象

NativeQuery春季数据返回对象
EN

Stack Overflow用户
提问于 2017-06-08 12:49:57
回答 3查看 8.4K关注 0票数 4

我需要在Spring数据中实现如下查询:-

代码语言:javascript
复制
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个表,因此我必须在nativeQuery = true中使用nativeQuery = true(如果我错了,请纠正我)。

所以我的仓库方法是这样的:-

代码语言:javascript
复制
@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类如下所示:

代码语言:javascript
复制
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;
    }
}

我的测试方法:-

代码语言:javascript
复制
@Test
public void TotalActivityTest() throws Exception {
    List<MyObj> objA = myRepository.getTotalActivityMinutesByUser("TEST");

}

我得到了以下例外:-

org.springframework.core.convert.ConversionFailedException:未能从类型[java.lang.Object[]]转换为值'{TEST,5.0}‘的com.mycomp.MyObj类型;嵌套的异常是org.springframework.core.convert.ConverterNotFoundException:无转换器,可以从java.lang.String类型转换为com.mycomp.dto.MyObj类型

我需要一种将结果作为MyObj返回的方法。(或者至少有一种将其转换为MyObj的方法)这是可能的吗?

编辑:

从@Cepr0的答案构建,我的实体类如下所示:-

代码语言:javascript
复制
@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查询应该是什么样子.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-08 14:00:10

只需使用投影JPQL查询:

代码语言:javascript
复制
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();

由于我不知道实体类的结构,所以这个查询可能不是您所需要的。但如果你给他们看我会纠正这个问题..。

票数 13
EN

Stack Overflow用户

发布于 2017-06-08 13:37:34

查询将返回对象数组,通过对象数组将其存储在普通的object.Iterate中,并将其设置为如下所示

代码语言:javascript
复制
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);
}
票数 0
EN

Stack Overflow用户

发布于 2018-10-16 19:52:36

实际上,除了这个例外,我还有一个类似的问题。我有3个表: Project、Asset和ProjectAsset。ProjectAsset是一个项目可以拥有许多资产的参考表。所以我创建了3个存储库,每个实体一个。问题是,我将@查询放在ProjectAssetRepository中,但由于存储库扩展了CrudRepository,所以没有工作。ProjectAssetId是一个由项目和资产组成的嵌入标识。我不能只返回这个存储库中的Asset,所以我将方法移到AssetRepository中,一切都正常。如果使用的是交叉引用表,请确保提取正确的对象,否则会遇到此异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44436287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档