spring data jdbc 有没有办法避免 n+1 问题?
Is there a way with spring data jdbc avoid n+1 issue?
当我 运行 此查询时,我遇到了 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>
是的,你可以。
如果您不需要引用的实体,您应该使用没有这些属性的 class 作为 return 值。
如果您真的想要那些引用的实体,但有更有效的方法来构造带有引用的实体,您可以在 @Query
注释中指定自己的 ResultSetExtractor
或 RowMapper
.
当我 运行 此查询时,我遇到了 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>
是的,你可以。
如果您不需要引用的实体,您应该使用没有这些属性的 class 作为 return 值。
如果您真的想要那些引用的实体,但有更有效的方法来构造带有引用的实体,您可以在 @Query
注释中指定自己的 ResultSetExtractor
或 RowMapper
.