【发布时间】: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<? extends OriginalContent> 的列表,而find 方法返回NormalizedContent 的列表。
我该怎么做才能让 find 方法返回NormalizedContent<? extends OriginalContent> 的列表?
【问题讨论】:
-
你试过投
(Class<NormalizedContent<? extends OriginalContent>>) NormalizedContent.class吗? -
@OrestKyrylchuk 这是我目前的解决方案,但为此,我应该一一映射列表中的所有元素。我希望 find 方法返回这个,就好像我使用
NormalizedContent<? extends OriginalContent>.class -
所以你有下一个代码
List<NormalizedContent<? extends OriginalContent>> content = mongoTemplate.find(query, (Class<NormalizedContent<? extends OriginalContent>>) NormalizedContent.class);是吗?不知道一一是什么意思 -
@OrestKyrylchuk 我想要
List<NormalizedContent<? extends OriginalContent>> content = mongoTemplate.find(query, (Class<NormalizedContent<? extends OriginalContent>>) NormalizedContent.class);之类的东西,但它不正确。我当前的代码是List<NormalizedContent<? extends OriginalContent>> content = mongoTemplate.find(query, NormalizedContent.class).stream() .map(normalizedContent -> (NormalizedContent<OriginalContent>) normalizedContent).collect(Collectors.toList());。在这个解决方案中,我应该将列表中的所有元素一一转换。 -
@OrestKyrylchuk 第一个选项不起作用。错误是
Cannot cast from Class<NormalizedContent> to Class<NormalizedContent<? extends OriginalContent>>
标签: java spring criteria spring-data-mongodb generic-programming