【问题标题】:Unable to convert SQL to JPQL无法将 SQL 转换为 JPQL
【发布时间】:2019-10-01 02:18:38
【问题描述】:

我正在尝试转换以下 Oracle SQL(可行)

select sum(ct.some_count) from TABLE1 mc
  inner join TABLE2 xref on mc.cnum = xref.cnum
  inner join TABLE3 ct on xref.srt = ct.srt
  inner join TABLE4 pc on pc.id = xref.id
  where mc.CARD_NO = '111' and pc.code = '222';

关注 JPQL。

@Query("SELECT sum(ct.someCount) FROM Table1Entity mc " +
        "inner join TABLE2Entity xref on mc.cnum = xref.cnum " +
        "inner join TABLE3Entity ct on xref.srt = ct.srt " +
        "inner join TABLE4Entity pc on pc.id = xref.id " +
        "where mc.CARD_NO = :cardNumber and pc.code = :code")
long getTotalCount(@Param("cardNumber") String cardNumber, @Param("code") String code);

我收到以下异常。

QuerySyntaxException:意外令牌

我可以就我做错的事情寻求帮助吗?

我正在使用 Spring,这是我用于此查询的存储库。

@Repository(value = "someCountRepository")
public interface SomeCountRepository extends JpaRepository<Table3Entity, TableId> {
        @Query("SELECT sum(ct.someCount) FROM Table1Entity mc " +
        "inner join TABLE2Entity xref on mc.cnum = xref.cnum " +
        "inner join TABLE3Entity ct on xref.srt = ct.srt " +
        "inner join TABLE4Entity pc on pc.id = xref.id " +
        "where mc.CARD_NO = :cardNumber and pc.code = :code")
        long getTotalCount(@Param("cardNumber") String cardNumber, @Param("code") String code);
}

【问题讨论】:

  • JPQL 中的联接不是这样获得的。例如,SELECT p FROM Person p INNER JOIN Address a ON p.addressId = a.id WHERE a.city='London' 不正确,而 SELECT p FROM Person p INNER JOIN p.address a WHERE a.city='London' 是使用 JPQL 连接的正确方法。
  • @manish 查询怎么知道'a'是什么? -> INNER JOIN p.address a
  • JPA 使用对象。假设有一个Person 实体和一个Address 实体,分别代表一个人和一个地址。如果某人需要地址,则Person 实体必须有一个字段private Address address。然后,一个有效的 JPA 查询看起来像 FROM Person p INNER JOIN p.address a。 JPA 提供者知道p.addressAddress 类型,因此,它会自动将别名a 映射到Address 实体映射到的任何表。从这个意义上说,JPA 查询确实看起来像 SQL,但它需要实体和字段而不是表和列。

标签: sql spring oracle jpql


【解决方案1】:
@Query("SELECT sum(ct.someCount) FROM Table1Entity mc " +
        "inner join TABLE2Entity xref on mc.cnum = xref.cnum " +
        "inner join TABLE3Entity ct on xref.srt = ct.srt " +
        "inner join TABLE4Entity pc on pc.id = xref.id " +
        "where mc.CARD_NO = :cardNumber and pc.code = :code",
        nativeQuery = true) // set native query to true
long getTotalCount(@Param("cardNumber") String cardNumber, @Param("code") String code);

由于您是完全从非 JPQL 的 Oracle SQL 复制查询,因此您应该将其声明为本机查询。

参考:Spring Data JPA @Query #2.2。原生

【讨论】:

  • 我试图转换而不使用本机查询,但我猜这也可以。会试一试的。
  • 您好,谢谢。但这对我不起作用。要求额外的配置作为它的本机。
  • @kang 你能详细说明为什么它不适合你吗?或者,也许您可​​以查看 manish 评论以构建正确的 JPQL 查询。
猜你喜欢
  • 1970-01-01
  • 2014-08-02
  • 2018-03-16
  • 2011-09-29
  • 1970-01-01
  • 2019-07-13
  • 2021-01-22
  • 1970-01-01
  • 2014-03-08
相关资源
最近更新 更多