返回

Spring Cloud Data Datastore 中 @Unindexed 注释对 Map 和 List<Ref<?>> 字段的限制及其解决方法

java

Spring Cloud Data Datastore 中 @Unindexed 注释的局限性:Map 和 List<Ref<?>>

概述

@Unindexed 注释在 Spring Cloud Data Datastore 中用于从索引中排除字段。然而,在 MapList<Ref<?>> 字段上使用此注释时,它并不完全有效。本文探讨了这种限制,提供了替代解决方案,并提出了未来改进的建议。

问题

@Unindexed 注释应用于 MapList<Ref<?>> 字段时,这些字段仍然会被索引。这与使用 @Unindexed 注释的预期行为不同,因为它旨在从索引中排除指定的字段。

原因

Spring Data Datastore 目前不支持 MapList<Ref<?>> 字段上的 @Unindexed 注释。原因是这些类型的字段的内部表示方式,使从索引中排除它们变得复杂。

解决方法

虽然无法直接在 MapList<Ref<?>> 字段上使用 @Unindexed 注释,但有替代方法可以实现类似的行为。一种方法是使用查询过滤器或投影。

  • 查询过滤器: 可以在查询中指定过滤器来排除特定字段。例如,以下查询将排除 attributes 字段:
Query<Library> query = Query.newEntityQueryBuilder()
    .setFilter(PropertyFilter.eq("attributes", null))
    .build();
  • 投影: 可以在查询中使用投影来指定要返回的字段。这可以用于从查询结果中排除特定字段。例如,以下查询将返回仅包含 idsets 字段的 Library 实体:
Query<Library> query = Query.newEntityQueryBuilder()
    .setProjection("id", "sets")
    .build();

局限性

替代解决方案的主要局限性是它们需要在每个查询中手动指定排除的字段。这可能会增加查询的复杂性,尤其是当需要排除多个字段时。

未来改进

Spring Cloud Data Datastore 团队认识到了这个限制,并计划在未来的版本中解决它。目标是为 MapList<Ref<?>> 字段提供一致的 @Unindexed 功能支持。

常见问题解答

  • 为什么 ** @Unindexed 注释不能在 ** Map** 或 ** List<Ref<?>>** 字段上使用?**

    因为这些类型的字段的内部表示方式使得从索引中排除它们变得复杂。

  • 有什么替代方法可以实现类似的行为?

    可以使用查询过滤器或投影来排除特定字段。

  • 这些替代方案有什么局限性?

    它们需要在每个查询中手动指定排除的字段。

  • Spring Cloud Data Datastore 团队是否计划解决此限制?

    是的,他们计划在未来的版本中解决它。

  • 什么时候可以期待 ** Map 和 ** List<Ref<?>>** 字段对 ** @Unindexed** 注释的支持?**

    Spring Cloud Data Datastore 团队尚未宣布确切的发布日期。