【问题标题】:Joining unrelated tables via JPQL通过 JPQL 连接不相关的表
【发布时间】:2019-10-01 23:55:34
【问题描述】:

我有以下有效的查询。此查询中的所有表都以某种方式存在关系。

@Repository(value = "ARepository")
public interface ARepository extends JpaRepository<CardEntity, String> {
    @Query("SELECT xref.shortUtlTx FROM CardEntity card " +
            "JOIN card.apexUrlCrossRef xref " +
            "JOIN xref.sampleProdOffer offer " +
            "WHERE xref.apexCard.cardNumber = :cardNum " +
            "AND offer.apexeeOfferId = :myCode"
    )
    List<String> getAllValues(@Param("cardNum") String cardNum, @Param("myCode") String myCode);
} 

但我也希望将另一个表(实体名称 -> UrlCountEntity)加入此查询,但该表与此查询中的其他表无关。有没有办法我可以做到这一点?

基于阅读博客,我尝试了以下但抛出错误。 在查询中添加了这一行:

并且存在(从 UrlCountEntity referCount WHERE 中选择 referCount referCount.url.urlTx = xref.shortUtlTx)

@Repository(value = "ARepository")
public interface ARepository extends JpaRepository<CardEntity, String> {

    @Query("SELECT xref.shortUtlTx FROM CardEntity card " +
            "JOIN card.apexUrlCrossRef xref " +
            "JOIN xref.sampleProdOffer offer " +
            "WHERE xref.apexCard.cardNumber = :cardNum " +
            "AND offer.apexeeOfferId = :myCode " +
            "AND EXISTS (SELECT referCount FROM UrlCountEntity referCount WHERE referCount.url.urlTx = xref.shortUtlTx)"
    )
    List<String> getAllValues(@Param("cardNum") String cardNum, @Param("myCode") String myCode);

}

错误如下:

方法抛出 'org.springframework.dao.InvalidDataAccessResourceUsageException' 例外。

无法提取结果集; SQL [不适用]

【问题讨论】:

    标签: sql spring jpa jpql


    【解决方案1】:

    基于this article: 使用 Hibernate 5.1 或更高版本,您可以通过 JQPL 连接两个不相关的表,就像在 SQL 中那样:

    SELECT first
    FROM First first JOIN
        Second second ON first.property = second.property
    WHERE first.property = :param
    

    因此,您需要将查询更改为以下内容:

    @Query("SELECT xref.shortUtlTx FROM CardEntity card " +
            "JOIN card.apexUrlCrossRef xref " +
            "JOIN xref.sampleProdOffer offer " +
            "JOIN UrlCountEntity referCount ON referCount.url.urlTx = xref.shortUtlTx" +
            "WHERE xref.apexCard.cardNumber = :cardNum " +
            "AND offer.apexeeOfferId = :myCode")
    List<String> getAllValues(@Param("cardNum") String cardNum, @Param("myCode") String myCode);
    

    【讨论】:

      猜你喜欢
      • 2019-01-26
      • 2023-03-27
      • 2017-09-08
      • 2016-03-10
      • 2012-11-09
      • 1970-01-01
      • 2016-02-18
      • 2020-10-05
      • 1970-01-01
      相关资源
      最近更新 更多