java - 如何在 Spring Data MongoDB 存储库查询方法中使用投影类型?

标签 java spring mongodb spring-data-mongodb

我一直在玩 Spring Data 和 MongoDB,并且有一个关于限制某些查询的数据量的问题。我已经看到在 MongoRepository 中添加自定义查询,但是我没有看到任何限制数据量和返回基本上是较大类子集的类的示例。

例如,我有一个具有多个字段的 User 类,但我还想创建一个 UserShort 类,该类具有 中的字段子集用户 类。例如 UserShort 将只包含 idfirstName/lastName/email 字段,而不是一切。

我已经看到我可以指定/限制返回的字段,但我可以将它们返回到不同的类中吗?目前 UserShort 将返回 null 除非我指定 User 类,但字段将限于我指定的字段。不确定这是否可能?我意识到下面的 User 类并不大,但这是我所追求的概念。

用户界面:

public interface Users {}

子集类:

public class UserShort implements Users {

    @Id
    private String id;

    private String firstName;
    private String lastName;

    @Indexed(unique = true)
    private String email;

    //getters / setters
}

全类:

@Document
public class User implements Users {

    @Id
    private String id;

    private String firstName;
    private String lastName;
    private String username;
    private String password;
    private Date dob;
    private Status status;

    @Indexed(unique = true)
    private String email;

    private Gender gender;
    private String locale;
    private Date registerDate;

    @DBRef
    private List<UserAddress> addresses;

    public User(){
        addresses = new ArrayList<UserAddress>();
    }

    //getters / setters
}

还有仓库接口(interface):

public interface UserRepository extends MongoRepository<Users, String> {

    public User findByEmail(String email);

    @Query(value="{ 'email' : ?0 }", fields="{ 'firstName' : 1, 'lastName' : 1}")
    public UserShort findUserShortByEmail(String email);

}

最佳答案

只要查询方法的返回类型可分配给托管域类型(在您的情况下为 Users),我们将更喜欢返回类型来确定运行查询的集合。因此,在您的情况下,我们将针对 userShort 而不是 users 执行查询,这就是您没有得到任何结果的原因。这种行为是为了支持将继承层次结构存储到不同的集合中。

如果您切换到 User 作为存储库的域类型,事情应该完全按预期工作。这也有利于防止客户端将 UserShort 实例交给 save(…) 方法,该方法将清除 User 中包含的属性,但是不在 UserShort 中。这是最终的存储库接口(interface)声明。

interface UserRepository extends MongoRepository<User, String> {

    User findByEmail(String email);

    @Query(value="{ 'email' : ?0 }", fields="{ 'firstName' : 1, 'lastName' : 1}")
    UserShort findUserShortByEmail(String email);
}

P.S.:@byte-crunch 在评论中概述了这目前仅适用于投影集合,但不适用于返回单个实例。这已在 DATAMONGO-1030 中报告并修复并将在 1.5.4 和 1.6.0 GA 中提供。

关于java - 如何在 Spring Data MongoDB 存储库查询方法中使用投影类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25393096/

相关文章:

java - Spring Social Facebook 登录的工作示例,github 上的示例应用程序除外

mongodb - 对 mongodb 中的大量记录进行缓慢分页

mongodb - 错误 : database names cannot contain the character ' '

mongodb - 如何使用 mongoose 在 mongodb 中的对象数组中搜索两个单独的键

java - 支持 mark() 和 reset() 的轻量级 java.io.InputStream 实现

java - JTable 不会显示

java - Jetty ALPN/NPN 尚未正确配置

java - 使用 MapStruct 将 2 个字符串字段映射到 OffsetDateTime

spring - 无法将 [java.util.ArrayList] 类型的属性值转换为属性 'annotatedClasses' 所需的类型 [java.lang.Class[]]

java - 错误 :java: javacTask: source release 8 requires target release 1. 8