问题描述
当我运行此查询时,我遇到了 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
。