Spring data JPA: поиск по столбцу члена пользовательского типа - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть сущность Person, у которой есть свойство Name. Имя не помечено как объект. Для класса Name у меня есть AttributeConverter, который создает полное имя путем объединения строк имени и фамилии. Таким образом, для объекта лица имя столбца имеет тип String.

@Entity
public class Person {
    // ...  
@Convert(converter = NameAttributeConverter.class)
@Column

private Name name;
    // ...
}

public final class Name implements Comparable, Serializable {
      // ...
      private String firstName;
      private String lastName;
      // ...
}

Это работает. Но теперь я хочу расширить свой личный репозиторий. Я хочу найти людей по ее фамилии. Но

List<Person> findByName_LastName(String lastName);

или

List<Person> findByNameLastName(String lastName);

не работает. Я получаю следующее исключение:

PersonRepository.findByName_LastName(java.lang.String)! Illegal attempt to dereference path source [null.name] of basic type

Как решить проблему? Спасибо и всего наилучшего

РЕДАКТИРОВАТЬ:

public interface PersonRepository extends CrudRepository<Person, Long>{
    // The repository works without the findByName...
    // List<Person> findByName_LastName(String lastName);
}

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Имя и фамилия считаются столбцом в базе данных, поскольку для столбца name используется преобразователь атрибутов. Таким образом, JPA обрабатывает name как столбец типа Name и не может выполнить запрос к Name полю типа объекта. Лучшее решение - хранить имя и фамилию в отдельном столбце, чтобы вы могли легко выполнять запросы. Но если вы хотите сделать поле concat из имени и фамилии и запрос к полю concat также, тогда вы можете использовать @Formula()

@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;

@Formula(value = "CONCAT(last_name, first_name)")
private String name;
1 голос
/ 06 апреля 2020

Это не работает с выводом запроса и не может работать, потому что в целом и в вашем случае функция, применяемая преобразованием, необратима. Это означает, что для того, чтобы Spring Data реализовал это, ему необходимо проанализировать преобразование, инвертировать его, то есть создать набор функций, которые производят имя и фамилию из объединенной строки, хранящейся в базе данных, и реализовать ее с использованием критериев. API. Я думаю, это очевидно, что это не может быть сделано.

Если вы знаете, какой запрос должен быть выполнен, используйте аннотацию @Query.

Лучшим решением было бы сохранить фамилию в отдельный столбец, чтобы к нему можно было легко получить доступ.

Если

...