spring 数据 jdbc 有没有办法避免 n+1 问题?

问题描述

当我运行此查询时,我遇到了 n+1 问题,其中数据 JDBC 获取活动对象的所有相关实体。有没有办法使用数据JDBC来避免这种情况?

@Query(
    """
  SELECT campaign.*
  FROM campaign
           JOIN targeting ON campaign.targeting_id = targeting.id
  WHERE (
    CASE
        WHEN campaign.applications_close_date IS NOT NULL
            THEN Now() BETWEEN campaign.start_date AND campaign.applications_close_date
        WHEN campaign.end_date IS NOT NULL
            THEN Now() BETWEEN campaign.start_date AND campaign.end_date
        ELSE Now() >= campaign.start_date
        END
    )
  AND NOT EXISTS
    (
    SELECT *
     FROM application
     WHERE application.campaign = campaign.id
      AND application.influencer = :influencerId 
    )
  """
  )
  fun findAllMatchingByInfluencerId(
    influencerId: Long,country: String?
  ): List<Campaign>

解决方法

是的,你可以。

如果您不需要引用的实体,您应该使用没有这些属性作为返回值的类。

如果您确实想要那些被引用的实体,但有更有效的方法来构造带有引用的实体,您可以在 ResultSetExtractor 注释中指定您自己的 RowMapper@Query