【问题标题】:How to work with SQL Views in Spring JPA?如何在 Spring JPA 中使用 SQL 视图?
【发布时间】:2017-01-10 15:09:37
【问题描述】:

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

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

我的视图由 2 个表组成,其中 4 个字段是其中一个表中一列的总和(计算每 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);

然后我只是将列表返回给控制器,控制器会以 JSON 格式显示。

问题是,我在 Eclipse 中创建了这个视图,直接使用 HANA DB 中的 SQL 代码,而不是在 Web 服务中创建它。

我想知道,有没有办法像我上面展示的那样选择,在没有模型类的情况下返回它? 它只需要一个具有完全相同字段的类,比如模型类但没有@Entity注解?

或者 有没有办法在 Spring JPA 中创建类似于模型类的视图?如果有办法,让它起作用的注释是什么?

Spring 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:在类中添加了公共构造函数。

最好的问候, 法米比卡

【问题讨论】:

  • 您可以直接将视图映射到 spring jpa 存储库。如果你真的想要,你可以写一个 viewrepository - 但它没有必要

标签: java spring jpa sql-view hana


【解决方案1】:

您应该能够将您的视图映射到一个 JPA 对象,只要它有一个主键(或复合键)。然后,您可以映射到 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);

findBySomeFieldOrderBySomeFieldDesc(String name_to_search)

【讨论】:

  • 你能详细解释一下吗?我在春天只有3个月。我如何将整个 SQL 查询更改为您所说的一个简单函数?我通常在控制器中执行此操作,然后 DAO 进行搜索并将结果返回给控制器。你是说我需要创建一个 JPA 类来接收它吗?一个模型?还是另一种类型?我将不胜感激!
【解决方案2】:

如果您希望 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();

希望它对你有用:)

【讨论】:

  • 非常感谢,但是,我应该如何声明 DtoQuery,我需要创建一个像 IncidentStatusResultsUser() 这样的构造函数,对吗?但是我应该把:“”“”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" """ 非常感谢!
  • DtoQuery 只是我用来表示长查询的String。我假设 em.createQuery 接受 String 作为您的问题。
  • 你的意思是这样的? ------ List resultList = em.createQuery("SELECT new IncidentStatusResultsUser(c.uploadDateTime, c.InProgress,c.Handover,c.ActionNeeded,c.New) FROM USERSTATUS WHERE c.name =?1 ORDER BY c.uploadDateTime DESC").setParameter(1, userID).setMaxResults(48).getResultList(); ----如果是这样还没有成功=(它给了我这个错误:---- HTTP状态500 - 请求处理失败;嵌套异常是org.springframework.dao.InvalidDataAccessApiUsageException:创建一个异常时发生在 EntityManager 中查询:---谢谢!
  • 这是创建查询时的错误?更多细节?对于 setParameter,而不是问号,尝试在查询中使用 :userID 并通过 setParameter("userID", userID);你在查询中的“c”是什么?我假设你应该在你的表名后面加上“c”!
  • c 是我通常在 Spring JPA api 上进行搜索的方式,如下所示:""SELECT c FROM TagIncident c WHERE c.tagName =?1"" 它工作正常,它是关于这个带有视图的特定查询。我会测试你的方式并告诉你,我只是需要一些时间来测试它,之前有一些优先级,非常感谢!我会在这里发表评论!
猜你喜欢
  • 2018-04-13
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 2017-01-10
  • 2022-09-22
  • 2020-02-28
相关资源
最近更新 更多