Реализовать подкачку для определенного типа для строк - PullRequest
0 голосов
/ 19 июня 2019

Я хочу реализовать нумерацию страниц только для определенного типа пользователей. Структура таблицы:

@Entity
@Table(name = "users")
public class Users implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, updatable = false, nullable = false, length = 3)
    private int id;

    @Column(length = 255)
    private String login;

    @Column(length = 255)
    private String email;

    @Column(length = 64)
    private String salt;

    @Column(length = 255)
    private String type;
    .....
}

Repository:

@Repository
public interface UserRepository extends JpaRepository<Users, Integer> {

}

Запрос:

@Override
public Page<Users> findAll(int page, int size) {
    return dao.findAll(PageRequest.of(page, size));
}

Как я могу ограничить запрос только для выбора type admin, super_admin и т. Д.

Полагаю, мне нужно добавить ограничение, например IN (admin, super_admin)?

1 Ответ

2 голосов
/ 19 июня 2019

, вероятно, самый простой способ - использовать соглашение об именах и использовать findAllByTypeIn:

interface UserRepository extends JpaRepository<User, Integer> {
  Page<User> findAllByTypeIn(Pageable page,String... types));
}

, но если у вас более сложные критерии поиска, я бы рассмотрел использование спецификаций

Spring Data JPA поддерживает спецификации, вы можете расширить интерфейс репозитория с помощью интерфейса JpaSpecificationExecutor следующим образом:

interface UserRepository extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> {

}

Напишите свою спецификацию

class UserSpecs {

    public static Specification<User> isOfType(String type) {

        return new Specification<User>() {

            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
                return builder.equal(root.get("type"), type);
            }
        };
    }


    public static Specification<User> isInTypes(String... types) {

        return new Specification<User>() {

            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
               In<String> inClause = builder.in(root.get("type"));
               for (String type: types) {
                 inClause.value(type);      
               }
               return inClause;
            }
        };
    }

}

и получите результатчерез

dao.findAll(UserSpecs.isOfType("admin").or(UserSpecs.isOfType("super_admin")) ,PageRequest.of(page, size));

или если вы предпочитаете использовать в

dao.findAll(UserSpecs.isInTypes("admin","super_admin")) ,PageRequest.of(page, size));
...