Spring Boot с 1.5.10 по 2.0 Spring Data Mongo @Query

У меня возникла последняя проблема с переходом со Spring Boot 1.5.10 на 2.0. Мои запросы, помеченные @Query, больше не работают. В 1.5.10 они работали нормально: вот запрос и сущность:

@Document(collection = "credentials")
public class Credentials implements Serializable, Comparable<Credentials>
{

    private static final long serialVersionUID = -921533822040690113L;

    @Id
    private UUID id;

    @Indexed
    @Field("userId")
    private UUID userId;

    @Field("access")
    private List<Access> access;

    @Field("roles")
    private List<String> roles;

    /**
     * @return the id
     */
    public UUID getId()
    {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(UUID id)
    {
        this.id = id;
    }

    /**
     * @return the userId
     */
    public UUID getUserId()
    {
        return userId;
    }

    /**
     * @param userId the userId to set
     */
    public void setUserId(UUID userId)
    {
        this.userId = userId;
    }

    /**
     * @return the access
     */
    public List<Access> getAccess()
    {
        return access;
    }

    /**
     * @param access the access to set
     */
    public void setAccess(List<Access> access)
    {
        this.access = access;
    }

    /**
     * @return the roles
     */
    public List<String> getRoles()
    {
        return roles;
    }

    /**
     * @param roles the roles to set
     */
    public void setRoles(List<String> roles)
    {
        this.roles = roles;
    }

    /**
     *
     */
    public Credentials()
    {}

Запрос такой:

public interface ICredentialsRepository extends MongoRepository<Credentials, UUID>
{

    /**
     * This query finds the credentials by userId
     * @param userId user identification
     * @return Credentials object
     */
    @Query("{ 'userId' : ?0}")
    Credentials retrieveWithUserId(UUID userId);
}

При запуске сейчас я получаю сообщение об ошибке

com.mongodb.MongoQueryException: Query failed with error code 2 and error message 'unknown operator: $uuid' on server

Еще раз, это отлично работало в Spring Boot 1.5.10. В проект включены spring-boot-starter-data-mongodb-2.0.0 и spring-boot-configuration-processor-2.0.0.

Почему вы используете строковый запрос вместо вывода запроса (findByUserId(UUID))? Строковые значения сериализуются в BSON / JSON, а кодировщик JSON MongoDB создает $uuid: ….

mp911de 23.03.2018 11:45

Вывод запроса работает. В этом примере я мог бы использовать это. Однако все мои другие операции «@Query» завершаются с той же ошибкой. Пример ошибки "@Query (" {'organizationId':? 0, 'startDate': {'$ gte':? 1}, 'dateArchived': null} ")" с той же ошибкой. InstituteId - это UUID, но не первичный ключ "_id"

Russell Collins 23.03.2018 14:56

Изменение UUID на строку приводит к тому, что запрос не возвращает никаких записей, хотя раньше он возвращал правильные записи.

Russell Collins 24.03.2018 01:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
3
918
1

Ответы 1

Это потому, что ваш UUID не является типом объекта / документа. Вы должны использовать @Document в классе UUID и @Embedded и @Embeddebable в классе UUID и ссылку на UUID в своем классе Credentials.

Для ясности: UUID является частью Java JDK и представляет собой GUID, предоставляемый MongoDB. Я попробую @Embeddable в объявлении объекта.

Russell Collins 22.03.2018 21:45

Хорошо, это решение "@Embedded" не работает. Интересно то, что "@Id" не имеет проблем с UUID. Проблема только в аннотации «@Query». Для этого, если я удалю аннотацию «@Query» и переименую метод в findByUserId, он заработает. В приложении есть и другие запросы, которые тоже не работают. Они ошибаются с тем же типом проблемы.

Russell Collins 22.03.2018 22:23

Другие вопросы по теме