Как заставить пользовательский тип вести себя как строка с QueryDSL - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь использовать пользовательский тип с QueryDSL, что-то вроде этого:

public class Email implements Comparable<Email> {
    public String name;
    public String domain;

    @Override
    public int compareTo(Email o) {
        return toString().compareTo(o.toString());
    }

    @Override
    public String toString() {
        return name + "@" + domain;
    }
}

У меня есть объект QueryDSL, который использует этот пользовательский тип:

@Entity
public class Record {
    public Email email;
    public String text;
}

Затем я могу строить запросы следующим образом:

BooleanExpression withEmail(Email email)
{
    QRecord Q = QRecord.record;
    BooleanExpression pred = Q.email.eq(email);
    return pred;
}

Однако при использовании MongodbSerializer запрос заканчивается установкой типа Email в монго DBObject, и позже я получаю исключение от драйвера монго, говорящее, что Email не может быть сериализовано.

java.lang.RuntimeException: json can't serialize type : class Email

Если я аннотирую поле email в моем Record, например:

@Entity
public class Record {
    @QueryType(PropertyType.STRING)
    public Email email;
    public String text;
}

Затем он начинает работать - хотя мне приходится манипулировать электронной почтой с помощью электронной почты в виде строк в моих конструкциях запросов вместо самих объектов электронной почты, напр. QRecord.record.email.eq(myEmail.toString()) вместо простого QRecord.record.email.eq(myEmail), как раньше.

Моя проблема с этим решением заключается в том, что любой, кто использует объект Email, должен знать, что он должен аннотировать его при встраивании в другой объект.

Вопрос: есть ли способ аннотировать класс Email таким образом, чтобы он всегда был сериализован как строковая сущность, или есть лучший способ достичь этого вообще?

...