首页 > 解决方案 > spring data, PagingAndSorting repository, Sort based on (nested) attribute value of class type

问题描述

我有一个由 Persons 组成的简单应用程序的 PagingAndSorting 存储库。像年龄这样的属性的简单排序效果很好......

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

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

我也想按姓氏对人进行排序。但我没有为名字和姓氏创建两个属性。我创建了一个包含名字和姓氏的类 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;
    }
}

如何按姓(或名字)排序?就像是

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

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

执行并且没有错误(例如人被打印在控制台上)但没有像预期的那样工作。

它使用 firstName 升序排序(不知道为什么)。

如何根据类名的 lastName 属性进行排序?

谢谢并恭祝安康

标签: javaspring-bootsortingjpaspring-data-jpa

解决方案


您将name列的数据存储firstName+" "+lastName在数据库中。

所以 JPA sort data by name 意味着 sort by firstName+" "+lastName

如果您在数据库单独的列中定义名字和姓氏,那么也可以按姓氏排序。您可以在此处按照我的回答来解决此问题。


推荐阅读