【问题标题】:Java Spring, find with MongoTemplate and generic typeJava Spring,使用 MongoTemplate 和泛型类型查找
【发布时间】:2017-12-16 11:42:59
【问题描述】:

我正在尝试构建一个返回通用对象列表的查询。

这是我的基础对象:

@Getter
@Setter
@EqualsAndHashCode(of = {"id"})
public class Normalized {

  public static final String J_ID = "id";
  public static final String J_CREATED_AT = "createdAt";
  public static final String J_UPDATED_AT = "udpatedAt";

  @Id
  @Indexed
  @JsonProperty(J_ID)
  private String id;
  @JsonProperty(J_CREATED_AT)
  private Instant createdAt;
  @JsonProperty(J_UPDATED_AT)
  private Instant updatedAt;

}

这是我的域对象:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
@Document    
public class NormalizedContent<E extends OriginalContent> extends Normalized {

  public static final String J_SOURCE = "source";
  public static final String J_EXTERNAL_URL = "externalUrl";
  public static final String J_MAIN_TEXT = "mainText";
  public static final String J_ORIGINAL_CONTENT = "originalContent";
  public static final String J_CREATED_DATE = "createdDate";

  @Indexed
  @JsonProperty(J_SOURCE)
  private Sources source;

  @Indexed
  @JsonProperty(J_CREATED_DATE)
  private Instant createdDate;

  @JsonProperty(J_EXTERNAL_URL)
  private String externalUrl;

  @JsonProperty(J_MAIN_TEXT)
  private String mainText;

  @JsonProperty(J_ORIGINAL_CONTENT)
  private E originalContent;
}

这是对我的功能的简化:

public Page<NormalizedContent<? extends OriginalContent>> findAllByQueriesAndFilters(
      List<String> queriesId, Pageable pageable) {
    if (queriesId == null || queriesId.isEmpty()) {
      throw new IllegalArgumentException("Queries unspecified");
    }
    Criteria criteria = Criteria.where(NormalizedContent.J_QUERY).in(queriesId);
    Query query = new Query(criteria);
    query.with(pageable);
    List<NormalizedContent<? extends OriginalContent>> content =
        mongoTemplate.find(query, NormalizedContent.class);

    Long total = mongoTemplate.count(query, OTBUserpanelUser.class);

    return new PageImpl<NormalizedContent<? extends OriginalContent>>(content, pageable, total);
  }

问题出在一行:

List<NormalizedContent<? extends OriginalContent>> content =
            mongoTemplate.find(query, NormalizedContent.class);

因为内容变量是NormalizedContent&lt;? extends OriginalContent&gt; 的列表,而find 方法返回NormalizedContent 的列表。

我该怎么做才能让 find 方法返回NormalizedContent&lt;? extends OriginalContent&gt; 的列表?

【问题讨论】:

  • 你试过投(Class&lt;NormalizedContent&lt;? extends OriginalContent&gt;&gt;) NormalizedContent.class吗?
  • @OrestKyrylchuk 这是我目前的解决方案,但为此,我应该一一映射列表中的所有元素。我希望 find 方法返回这个,就好像我使用 NormalizedContent&lt;? extends OriginalContent&gt;.class
  • 所以你有下一个代码List&lt;NormalizedContent&lt;? extends OriginalContent&gt;&gt; content = mongoTemplate.find(query, (Class&lt;NormalizedContent&lt;? extends OriginalContent&gt;&gt;) NormalizedContent.class); 是吗?不知道一一是什么意思
  • @OrestKyrylchuk 我想要List&lt;NormalizedContent&lt;? extends OriginalContent&gt;&gt; content = mongoTemplate.find(query, (Class&lt;NormalizedContent&lt;? extends OriginalContent&gt;&gt;) NormalizedContent.class); 之类的东西,但它不正确。我当前的代码是List&lt;NormalizedContent&lt;? extends OriginalContent&gt;&gt; content = mongoTemplate.find(query, NormalizedContent.class).stream() .map(normalizedContent -&gt; (NormalizedContent&lt;OriginalContent&gt;) normalizedContent).collect(Collectors.toList());。在这个解决方案中,我应该将列表中的所有元素一一转换。
  • @OrestKyrylchuk 第一个选项不起作用。错误是Cannot cast from Class&lt;NormalizedContent&gt; to Class&lt;NormalizedContent&lt;? extends OriginalContent&gt;&gt;

标签: java spring criteria spring-data-mongodb generic-programming


【解决方案1】:
List<NormalizedContent>   content =
    mongoTemplate.find(query, NormalizedContent.class);

从内容中停用 NormalizedContent 时,将其强制转换为拥有 &lt;? extends OriginalContent&gt; 类型的属性。

【讨论】:

  • 请查看how to answer 并更新您的答案以提供更多详细信息。具体来说,如果您解释一下这是如何解决问题的,将会很有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多