【问题标题】:Why hibernate with nativeSQL returns different result than SQL为什么使用 nativeSQL 休眠会返回与 SQL 不同的结果
【发布时间】:2021-12-25 19:17:47
【问题描述】:

我正在尝试使用外部应用从两个具有本机 SQL 的表/实体中获取结果。在 SQL Server 中,我得到了正确的答案,但是,使用相同的查询,我在 JPA 中得到了不同的结果。 在 SQL Server 中,我只从第二个表中获取最后一个 ID(应该如此),而在 JPA 中,我从第二个表中获取所有 ID。如何在 JPA 中仅获取第二个表中的最后一个 ID?

    public List<Client> getClients()
{
    List results = entityManager.createNativeQuery("SELECT top 17 c.ID, c.CustomerNumber, c.Name, c.Surname, c.Area, c.City, c.Address, c.PhoneNumber, c.CustomerTypeID, c.Enabled, c.DateCreated, p.Credit, p.Debit\n" +
                    "FROM tblCustomer c OUTER APPLY\n"+
                    "     (SELECT TOP 1 p.*\n" +
                    "      FROM tblPayments p\n" +
                    "      WHERE c.CustomerNumber = p.CustomerNumber\n" +
                    "      ORDER BY p.id DESC\n" +
                    "     ) p;",
                    Client.class)
            .getResultList();
    return results;
}

SQL Server Result

  {
    "id": 1023,
    "customerNumber": "000001",
    "name": "Pajazit",
    "surname": "Neziri",
    "area": "1",
    "city": "Çegran",
    "address": "Bake",
    "phoneNumber": "",
    "customerType": 2,
    "enabled": false,
    "dateCreated": "2016-10-25",
    "payments": [
      {
        "id": 16238,
        "customerNumber": "000001",
        "invoiceNumber": "9000001112018",
        "monthOfPayment": "11-2018",
        "dateOfPayment": "2018-11-18",
        "credit": 1200.0,
        "debit": 0.0,
        "paymentPeriod": "M",
        "operator": 0,
        "printed": "T",
        "paied": "T",
        "isInvoice": "T"
      },
      {
        "id": 20459,
        "customerNumber": "000001",
        "invoiceNumber": "900000112019",
        "monthOfPayment": "1-2019",
        "dateOfPayment": "2019-01-09",
        "credit": 0.0,
        "debit": 600.0,
        "paymentPeriod": "M",
        "operator": 0,
        "printed": "T",
        "paied": "T",
        "isInvoice": "T"
      },
      {
        "id": 20538,
        "customerNumber": "000001",
        "invoiceNumber": "2000001112018",
        "monthOfPayment": "11-2018",
        "dateOfPayment": "2019-01-09",
        "credit": 0.0,
        "debit": 600.0,
        "paymentPeriod": "M",
        "operator": 1,
        "printed": "T",
        "paied": "T",
        "isInvoice": "T"
      },
      {
        "id": 20557,
        "customerNumber": "000001",
        "invoiceNumber": "2000001122018",
        "monthOfPayment": "12-2018",
        "dateOfPayment": "2019-01-09",
        "credit": 0.0,
        "debit": 600.0,
        "paymentPeriod": "M",
        "operator": 1,
        "printed": "T",
        "paied": "T",
        "isInvoice": "T"
      },
      {
        "id": 20576,
        "customerNumber": "000001",
        "invoiceNumber": "2000001012019",
        "monthOfPayment": "01-2019",
        "dateOfPayment": "2019-01-09",
        "credit": 0.0,
        "debit": 600.0,
        "paymentPeriod": "M",
        "operator": 1,
        "printed": "T",
        "paied": "T",
        "isInvoice": "T"
      },....

【问题讨论】:

    标签: sql spring-boot hibernate


    【解决方案1】:

    您可以使用与您的查询非常相似的 JPQL 查询。

    select t from tblPayments t order by t.id desc
    

    如果要根据搜索最后一条记录添加条件,也可以在上面的查询中输入。

    建立查询对象后,您可以调用

    query.getSingleResult() or call query.setMaxResults(1)
    

    【讨论】:

    • 我想通过一个请求从组合表中获取结果。您的建议是,在我看来,我必须两次调用数据库。
    • 根据你的应用环境你要选择。我的建议是单独提出一个更好的要求。
    【解决方案2】:

    由于某种原因,使用 EntityManager,响应与来自 SQL Server 的响应不同。然后我尝试使用 JPQL,再次得到的答案与 SQL Server 中的答案不同。做了更多的研究,让我找到了另一种方法,使用 JDBC RowMapper 并最终使用它,我得到了与 SQL Server 相同的结果,如下所示:

        @GetMapping("/testi2")
    public List<CustomerResponse> getCCP2() {
        String sql = "SELECT top 1 c.ID, c.CustomerNumber, c.Name, c.Surname, c.Area, c.City, c.Address, c.PhoneNumber, c.CustomerTypeID, c.Enabled, c.DateCreated, p.Id, p.Debit, p.Credit\n" +
                "FROM TblCustomer c OUTER APPLY\n" +
                "     (SELECT TOP 1 p.*\n" +
                "      FROM TblPayments p\n" +
                "      WHERE c.CustomerNumber = p.CustomerNumber\n" +
                "      ORDER BY p.id DESC \n" +
                "     ) p;";
        List<CustomerResponse> result = jdbcTemplate.query(
                sql,
                new BeanPropertyRowMapper(CustomerResponse.class));
    
        return result;
    }
    

    }

    不过,谢谢@Sathiyaraj 和@Faeemazaz Bhanej。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 2021-08-28
      相关资源
      最近更新 更多