如何在Spring JPA中使用SQL视图?

时间:2016-09-02 13:18:14

标签: java spring jpa sql-view hana

我目前正在使用Spring和HANA DB开展项目。

我已经有一个正常工作的Web服务,但我需要从我的HANA数据库中选择一个View(在Spring Webservice之外创建)。

我的视图来自2个表,其中4个字段是来自其中一个表的一列的SUM(计算每4个可能值中的每一个的多少,并在4个字段的每一个中显示为数字)

我在一些Spring JPA帖子中看到它应该通过简单的选择正常工作,我的问题是:

我通常选择这样的选择:

TypedQuery<name_of_the_model_class> query = em.createQuery("SELECT c FROM NameOfTheTable ORDER BY c.some_field DESC WHERE c.name =?1 ", name_of_the_model_class.class);
query.setParameter(1, name_to_search);

之后我将列表返回给Controller,Controller将其显示在JSON中。

问题是,我在Eclipse中创建了这个View,直接在HANA DB中使用SQL代码,而不是在Webservice上创建它。

我想知道,有没有一种方法可以像我上面所示那样选择,在没有模型类的情况下返回它? 它只需要一个具有完全相同字段的类,如a模型类但没有@Entity注释吗?

OR 有没有办法在Spring JPA中创建类似模型类的视图?如果有办法,有什么注释可以使它起作用?

春天JPA不会接受我在没有上课的情况下退回吗?

我阅读了大量帖子,但没有找到它,即使在手册中也没有给出明确的说明或示例。

非常感谢您的时间,如果我没有解释清楚,请告诉我,我真的坚持这一点。

更多信息(我的最新尝试): 我在DAO的整个搜索功能:

public List<IncidentStatusResultsUser> getIncidentStatusByUser(String userID) throws ParseException {   

        List<IncidentStatusResultsUser> resultList = em.createQuery("SELECT c FROM USERSTATUS ORDER BY c.uploadDateTime DESC WHERE c.userID=?1 ").setMaxResults(48).getResultList();


        Collections.reverse(resultList);

        return resultList;              
    }

我创建了一个类来接收具有相同视图字段的数据:

public class IncidentStatusResultsUser {

    private Date uploadDateTime ;
    private int status1;
    private int status2;
    private int status3;
    private int status4;

    //All gets and sets ommited
    public IncidentStatusResultsUser (Date uploadDateTime, long status1, long status2, long status3, long status4) {
    this.uploadDateTime = uploadDateTime;
    this.status1= status1;
    this.status2= status2;
    this.status3= status3;
    this.status4= status4;
    }


}

EDIT-2:在类中添加了公共构造函数。

最诚挚的问候, Famibica

2 个答案:

答案 0 :(得分:0)

只要具有主键(或复合键),您就应该能够将视图映射到JPA对象。然后,您可以映射到Spring JPA Reposiry,以便查询来自 -

TypedQuery<name_of_the_model_class> query = em.createQuery("SELECT c FROM NameOfTheTable ORDER BY c.some_field DESC WHERE c.name =?1 ", name_of_the_model_class.class);
query.setParameter(1, name_to_search);

findBySomeFieldOrderBySomeFieldDesc(String name_to_search)

答案 1 :(得分:0)

如果您希望JPA直接返回对象列表,则需要 DTO ,就像您创建的IncidentStatusResultsUser一样。确保你有一个constructor占用所有字段,例如:

public IncidentStatusResultsUser(Date uploadDateTime, int status1, int status2, int status3, int status4)

然后在您的查询字符串dtoQuery中,您可以执行以下操作:

SELECT new IncidentStatusResultsUser(c.uploadDateTime, c.status1,c.status2,c.status3,c.status4) 
FROM NameOfTheTable 
ORDER BY c.some_field DESC 
WHERE c.name =?1

然后你应该可以打电话给你的东西:

List<IncidentStatusResultsUser> resultList = em.createQuery(dtoQuery).setMaxResults(48).getResultList();

希望它适合你:)