Spring Data- MongoRepository:我们可以将二进制类型作为_id吗?

时间:2014-08-29 20:57:31

标签: java spring mongodb spring-data-mongodb

我有一个代表名为“archive”的Mongo集合的类

@Document(collection = "archive")

public class Message{
    @Id
    private byte[] messageId;

    private String from;
    private String to;
    // more stuff

}

MessagesRepository接口扩展了MongoRepository:

public interface MessagesRepository extends MongoRepository<Message, String>{

}

通过API调用,我收到了findMessage请求,该请求在messageId中为String提供了messagesRepository.findOne()。然后我需要将其编码为byte []然后调用byte[]方法。 (请记住ID为null)。

失败了。它返回byte []。我想因为Mongo中存储的byte[]findOne()方法中的byte[]不同,因为即使具有相同值的不同字符串也会生成不同的{{1}}数组。

我该如何使这项工作?或者是否真的可以在二进制文件中使用_id?

2 个答案:

答案 0 :(得分:0)

使用byte[]作为身份证明,您并没有帮忙。

你说你得到的消息是String - 为什么不使用它?否则你可能最终会在字符串和字节类型之间进行转换(除非使用byte[]不是你自己选择的,而是给你一个约束)。你注意到自己即使从相同的字符串生成的字节也不匹配。

简短的例子:

public static void main(String[] args) throws Exception {
    String s1 = "hello";
    String s2 = "hello";

    System.out.println("our two strings: ");
    System.out.println(s1);
    System.out.println(s2);

    // one of the first thing we learned when starting with
    // java was that this is not equal
    System.out.println();
    System.out.println("compare with ==");
    if(s1==s2) System.out.println("equal");
    else System.out.println("not equal");

    // but this is equal
    System.out.println("compare with equals()");
    if(s1.equals(s2)) System.out.println("equal");
    else System.out.println("not equal");

    // create the byte arrays and compare them
    byte[] b1 = s1.getBytes();
    byte[] b2 = s2.getBytes();

    System.out.println();
    System.out.println("byte array 1: " + b1.toString());
    System.out.println("byte array 2: " + b2.toString());

    // same as for strings
    System.out.println("compare with ==");
    if(b1==b2) System.out.println("equal");
    else System.out.println("not equal");

    // not equal, unlike the strings from which we
    // created the byte arrays
    System.out.println("compare with equals()");
    if(b1.equals(b2)) System.out.println("equal");
    else System.out.println("not equal");


    // create string out of the bytes again and compare
    String ss1 = new String(b1, "UTF-8");
    String ss2 = new String(b2, "UTF-8");

    System.out.println();
    System.out.println("re-created string 1: " + ss1);
    System.out.println("re-created string 2: " + ss2);

    // this is equal again
    System.out.println("compare re-created strings with equals()");
    if(ss1.equals(ss2)) System.out.println("equal");
    else System.out.println("not equal");
}

这就是为什么我问为什么它必须是字节;它让一切变得更加艰难,而不是更容易。

答案 1 :(得分:0)

嗯,它仍然奏效。我可以byte[]作为_id。我能够成功插入和检索东西。问题find()在MongoRepository中。需要对其进行调整以使其有效。

请参阅:http://pastebin.com/xHVQJYfN

编辑:我得到了最新的驱动程序,它可以立即运行。