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




Это потому, что ваш UUID не является типом объекта / документа. Вы должны использовать @Document в классе UUID и @Embedded и @Embeddebable в классе UUID и ссылку на UUID в своем классе Credentials.
Для ясности: UUID является частью Java JDK и представляет собой GUID, предоставляемый MongoDB. Я попробую @Embeddable в объявлении объекта.
Хорошо, это решение "@Embedded" не работает. Интересно то, что "@Id" не имеет проблем с UUID. Проблема только в аннотации «@Query». Для этого, если я удалю аннотацию «@Query» и переименую метод в findByUserId, он заработает. В приложении есть и другие запросы, которые тоже не работают. Они ошибаются с тем же типом проблемы.
Почему вы используете строковый запрос вместо вывода запроса (
findByUserId(UUID))? Строковые значения сериализуются в BSON / JSON, а кодировщик JSON MongoDB создает$uuid: ….