java - NativeQuery Spring Data 返回对象

标签 java jpa spring-data nativequery

我需要像这样在 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 个表,因此我必须使用 @QuerynativeQuery = 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: 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]

我需要一种方法将结果作为 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 查询应该是什么样子...

最佳答案

只需使用 ProjectionJPQL查询:

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();

此查询可能不完全符合您的需要,因为我不知道您的实体类的结构。但是如果你给他们看我会更正查询...

关于java - NativeQuery Spring Data 返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44436287/

相关文章:

java - 组件未显示在 JFrame 中

java - I/O "check if file name specified"args != 2 件事

java - 我删除具有 X 年龄值的特定节点的删除方法将不起作用

java - 我是否在组合键中正确定义了多对一?

java - JPQL:OR 不会按预期工作

java - JPA:如何将持久性上下文与批量更新或删除的结果同步?

java - 当我在此 Spring 应用程序中使用 JdbcTemplate BeanPropertyRowMapper 类时,为什么会出现此 InstantiationException?

java - 在 Java 中将字符串拆分为 n 个长度的 block

java - 如何使 Spring Data Elasticsearch 使用 java.time.LocalDateTime 获取日期

java - 使用Spring时如何注入(inject)多个JPA EntityManager(持久化单元)