繁体   English   中英

NativeQuery Spring Data返回对象

[英]NativeQuery Spring Data return object

我需要在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:无法从类型[java.lang.Object []]转换为类型为“{TEST,5.0}”的类型[com.mycomp.MyObj]; 嵌套异常是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查询应该如何...

只需使用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();

此查询可能不是您需要的,因为我不知道您的实体类的结构。 但是如果你展示它们我将更正查询......

查询返回您存储在普通对象中的对象数组。通过对象数组迭代并将其设置为对象,如下所示

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

我实际上遇到了与此例外类似的问题。 我有3个表:Project,Asset和ProjectAsset。 ProjectAsset是一个参考表,其中一个项目可以拥有许多资产。 所以我创建了3个存储库,每个实体一个。 问题是我将我的@Query放在ProjectAssetRepository中,并且由于存储库扩展了CrudRepository而无法正常工作。 ProjectAssetId是一个由projectid和assetid组成的嵌入式id。 我不能只在这个存储库中返回Asset对象,所以我将方法移动到AssetRepository,一切正常。 如果您使用交叉引用表,请确保提取正确的对象,否则您将遇到此异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM