Java NativeQuery Spring数据返回对象

Java NativeQuery Spring数据返回对象,java,jpa,spring-data,nativequery,Java,Jpa,Spring Data,Nativequery,我需要在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; @Query(value =

我需要在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;
@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);
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;
    }
}
@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;

}
因此我需要连接3个表,因此我必须使用
@Query
nativeQuery=true
(如果我在这里出错,请纠正我)

因此,我的存储库方法如下所示:-

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;
@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);
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;
    }
}
@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;

}
我的测试方法:-

@Test
public void TotalActivityTest() throws Exception {
    List<MyObj> objA = myRepository.getTotalActivityMinutesByUser("TEST");

}

我不确定JPQL中的连接查询应该是什么样子…

查询返回的是存储在普通对象中的对象数组。遍历对象数组并将其设置为如下所示的对象

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);
}
List test=newarraylist();
List rows=query.List();
对于(对象[]行:行){
MyObj-temp=新的MyObj(arg1,arg2);
temp.set((数据类型)行[0])//您需要为pojo创建getter和setter
..
测试。添加(温度);
}
只需使用和查询:

公共接口名称和持续时间{
字符串getName();
Long getDuaration();
}
@查询(“选择u.name作为名称,sum(a.minutes)作为用户u加入u.activityStatus st加入st.activity a的持续时间,其中st.status=“COMPLETED”和u.type=?1个按u.name分组”)
列出getNameAndDurationByUserType(字符串用户类型);
List List=getNameAndDurationByUserType(“测试”);
字符串userName=list.get(0.getName();

这个查询可能不是您所需要的,因为我不知道您的实体类的结构。但是如果你给他们看,我会更正查询…

除了这个例外,我实际上也遇到了类似的问题。我有3个表:Project、Asset和ProjectAsset。ProjectAsset是一个项目可以有多个资产的参考表。所以我创建了3个存储库,每个实体一个。问题是我将@Query放在ProjectAssetPository中,但由于存储库扩展了CrudePository,因此无法正常工作。ProjectAssetId是由projectid和assetid组成的嵌入式id。我不能只返回这个存储库中的资产对象,所以我把方法移到了AssetPository,一切都正常了。如果使用的是交叉引用表,请确保拉取了正确的对象,否则会遇到此异常

您是否像sqldeveloper一样在db ui中执行此查询,因为您在哪里使用连接来建立关系?是的,查询没有问题。从异常中可以看到结果是{TEST,5.0},这正是我在工作台上运行查询得到的结果。问题在于将结果集映射到MyObj。查询返回的是存储在对象中的对象数组。遍历对象数组并将其设置为object多亏了帮助,还没有完全正常工作。下面是我的实体类的外观:-
@Entity public class ActivityStatus扩展了基{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)private Long Id;@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH,CascadeType.DETACH})私有活动;@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH,CascadeType.DETACH})私有用户;}
在这种情况下,我应该如何在JPQL中编写JOIN查询?谢谢!我很抱歉有这么多杂乱的评论,但我成功地构建了正确的JPQL查询,并且成功了!明天将进一步尝试。您的答案看起来肯定更清晰。因此我将此标记为答案。因为我发现成功的关键是使用接口(而不是类)并命名结果集名称以匹配接口。谢谢。对我来说很有效!唯一要记住的是列的顺序(在本机查询中)界面必须相同。:)感谢您的帮助,我很确定您的答案也适用,但我猜Cepr0的答案更简洁。感谢您的帮助。很高兴您能够解决此问题。欢迎您。