【问题标题】:How to build a Morphia query on a subset of the properties of a Java Collection's elements?如何在 Java 集合元素的属性子集上构建 Morphia 查询?
【发布时间】:2013-10-25 18:24:18
【问题描述】:

我无法根据嵌入式 Java 集合的字段值查询 MongoDB 文档。

我有以下实体:

@Entity
public class StationHistoryEntry // extends ...
{
    @Embedded
    private Set<SongFeedback> songFeedback = new HashSet<SongFeedback>();

    // ...
}

还有下面的嵌入式类:

@Embedded
public class SongFeedback // extends ...
{
    @Embedded
    private FeedbackType feedbackType;

    private ObjectId userId;

    public enum FeedbackType {
        THUMBS_UP, THUMBS_DOWN, STAR;
    }

    // other properties
}

我需要做的是找到具有SongFeedbackStationHistoryEntries 以及给定的userIdfeedbackType=STAR

我尝试了以下方法,但是当其他 SongFeedback 属性(由于我无法控制它们的值而未显示在代码 sn-p 中的属性)不是 null 时,我没有成功,这发生在生产中:

public List<StationHistoryEntry> findStarredByUserId(ObjectId userId) {
    SongFeedback songFeedback = new SongFeedback(FeedbackType.STAR, userId);
    return ds.find(StationHistoryEntry.class)
        .filter("songFeedback elem", songFeedback).asList();
}

我也尝试了以下方法,但它总是返回一个空列表:

public List<StationHistoryEntry> findStarredByUserId(ObjectId userId) {
    Query<StationHistoryEntry> query = ds.createQuery(StationHistoryEntry.class);
    query.and(
        query.criteria("songFeedback.userId").equal(userId),
        query.criteria("songFeedback.feedbackType").equal(FeedbackType.STAR));
    return query.asList();
}

如果有帮助的话,我已经创建了一个带有精简代码和单元测试的 Github 存储库:https://github.com/gabrielcs/MorphiaQueryStackOverflow

有什么想法吗?谢谢!

【问题讨论】:

    标签: java mongodb mongodb-query morphia


    【解决方案1】:

    试试这个

    public List<StationHistoryEntry> findStarredByUserId(ObjectId userId) {
        Query<StationHistoryEntry> query = ds.createQuery(StationHistoryEntry.class);
        query.and(
            query.criteria("songFeedback.userId").equal(userId),
            query.criteria("songFeedback.feedbackType").in(FeedbackType.STAR));
        return query.asList();
    }
    

    【讨论】:

    • 感谢您的反馈,但我遇到了编译错误,因为 in() 需要 Iterable。如果它有帮助,我已经创建了一个带有精简代码和单元测试的 Github 存储库:github.com/gabrielcs/MorphiaQueryStackOverflow
    • 你可以将它包装在一个列表中:Arrays.asList(FeedbackType.STAR)
    • 没有更多的编译错误。但是,如果我查询userId1 加星标的歌曲,并有一个StationHistoryEntry suserId1THUMBS_UP SongFeedbackuserId2STAR SongFeedback,那么结果将包含s ,这不应该发生。我在findStarredByUserId(userId1) 的查询结果中需要的只是StationHistoryEntries,它至少有1 个单一的SongFeedback,userId1STAR
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2012-06-14
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多