@Entity
@Table(name = "TODO")
@NoArgsConstructor
@Data
public class Todo {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long todoId;
private String contents;
@Column(nullable = false)
private LocalDateTime createdDatetime = LocalDateTime.now();
private LocalDateTime updatedDatetime;
@ColumnDefault(value="'N'")
private String completeYn;
}
// JpaSpecificationExecutor를 상속받는 Repository
public interface JpaTodoRepository extends JpaRepository<Todo, Integer>, JpaSpecificationExecutor<Todo> {
}
// JpaSpecificationExecutor 내부
public interface JpaSpecificationExecutor<T> {
T findOne (Specification<T> spec);
List<T> findAll (Specification<T> spec);
Page<T> findAll (Specification<T> spec, Pageable pageable);
List<T> findAll (Specification<T> spec, Sort sort);
long count(Specification<T> spec);
}
public class TodoSpecification {
public static Specification<Todo> equalTodoId(Long todoId) {
return new Specification<Todo>() {
@Override
public Predicate toPredicate(Root<Todo> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
// 1) equal
return criteriaBuilder.equal(root.get("todoId"), todoId);
}
};
}
public static Specification<Todo> likeContents(String contents) {
return new Specification<Todo>() {
@Override
public Predicate toPredicate(Root<Todo> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
// 2) like
return criteriaBuilder.like(root.get("contents"), "%" + contents + "%");
}
};
}
public static Specification<Todo> betweenCreatedDatetime(LocalDateTime startDatetime, LocalDateTime endDatetime) {
return new Specification<Todo>() {
@Override
public Predicate toPredicate(Root<Todo> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
// 3) between
return criteriaBuilder.between(root.get("createdDatetime"), startDatetime, endDatetime);
}
};
}
}
참고 블로그 : https://groti.tistory.com/49