данные источника, хранилище PagingAndSorting, сортировка по (вложенному) значению атрибута типа класса - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть репозиторий PagingAndSorting для простого приложения, состоящего из людей. Простая сортировка для такого свойства, как age, работает хорошо ...

Sort sort = Sort.by("age").ascending();

for (Person p : personRepository.findAll(sort)) {
    log.info(p.toString());
}

Я хочу также отсортировать людей по lastName. Но я не создаю два атрибута для имени и фамилии. Я создал класс Name, который содержит имя и фамилию, и сделал атрибут name этого типа в Person ...

@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;
      // ...
}

public class NameAttributeConverter implements AttributeConverter<Name,String> {
 {
        String firstName = attribute.getFirstName() == null ? " " : attribute.getFirstName();
        String lastName =  attribute.getLastname() == null ? " " : attribute.getLastname();

        return  firstName+" "+lastName;
    }

    public Name convertToEntityAttribute(String dbData) {
        if(dbData!=null && dbData.split(" ").length > 0) {
            String fname = dbData.split(" ")[0];
            String lname = dbData.split(" ")[1];

            return new Name(fname,' ',lname);
          }

          return null;
    }
}

Как мне сортировать по lastName (или firstName)? Что-то вроде

Sort sort = Sort.by("name").ascending();

for (Person p : personRepository.findAll(sort)) {
    log.info(p.toString());
}

выполняется и не выдает ошибок (например, люди печатаются на консоли), но работает не так, как ожидалось.

Сортировка по возрастанию осуществляется с использованием firstName (не знаю почему).

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

Спасибо и всего наилучшего

1 Ответ

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

Вы храните данные name столбца как firstName+" "+lastName в базе данных.

Таким образом, JPA сортировка данных по имени означает сортировку по firstName+" "+lastName.

Если вы задаете имя и фамилию в отдельный столбец базы данных, то можно также сортировать по фамилии. Вы можете следить за моим ответом здесь для решения этой проблемы.

...