我是 JPA 的新手。我有一堂這樣的課
@Table(name="student")
@Entity
public class Student{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int studentId;
@Column
@Size(max = 20)
private String name;
@Column
@Min(value = 2014)
@Max(value = 2020)
private int yearOfBirth;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "classroomId")
Classroom classroom;
//Getters and setters
}
我的存盤庫:
@Repository
public interface HocSinhRepository extends JpaRepository<Student, Integer> {}
我的控制器:
public class StudentController {
@Autowired
StudentRepository studentRepository;
@GetMapping(value = "/get")
public Page<Student> get(@RequestParam Optional<Integer> page, @RequestParam Optional<String> sortBy) {
return studentRepository.findAll(
PageRequest.of(page.orElse(0), 3, Sort.Direction.ASC, sortBy.orElse("name"))
);
}
}
通過使用 Optional.orElse,如果 sortBy 引數為空,我可以為它分配一個默認值。如果引數不為空,而只是一個不合理的字串(如“asdasd”),我該如何做同樣的事情?
uj5u.com熱心網友回復:
您可以使用選項的map運算子。
所以它會
sortBy.map(o -> {
if (o.equalsIgnoreCase("asdasd")){
return "name";
} else {
return o;
}
}).orElse("name"));
"name"當它為空或包含值存在并且忽略大小寫時,這將使可選回傳值"asdasd"。在所有其他情況下,它將回傳它包含的原始值。
所以你的代碼將被調整為
return studentRepository.findAll(
PageRequest.of(page.orElse(0), 3, Sort.Direction.ASC,
sortBy.map(o -> {
if (o.equalsIgnoreCase("asdasd")){
return "name";
} else {
return o;
}}).orElse("name"));
));
uj5u.com熱心網友回復:
@xerx593 的變化VALID_SORT_FIELDS并使 spring 的 @RequestParam 可選
public static final Set<String> VALID_SORT_FIELDS = Set.of("name", "studentId");
@GetMapping(value = "/get")
public Page<Student> get(
@RequestParam(required = false, defaultValue = "0") Integer page,
@RequestParam(required = false, defaultValue = "name") String sortBy) {
String sortByOrDefault = VALID_SORT_FIELDS.contains(sortBy) ? sortBy : "name";
return studentRepository.findAll(PageRequest.of(page, 3, Sort.Direction.ASC, sortByOrDefault));
}
uj5u.com熱心網友回復:
另一種變體:
@GetMapping(value = "/get")
public Page<Student> get(
@RequestParam(required = false, defaultValue = "0") Integer page,
@RequestParam(required = false, defaultValue = "name") String sortBy) {
String sortByOrDefault = SortConfig.STUDENTS.getSortableFields().contains(sortBy)
? sortBy
: SortConfig.STUDENTS.getDefaultSortField();
return studentRepository.findAll(PageRequest.of(page, 3, Sort.Direction.ASC, sortByOrDefault));
}
public enum SortConfig {
STUDENTS(List.of("name", "studentId")),
ANOTHER_ENTITY(List.of("field1", "field2"));
private String defaultSortField;
private List<String> sortableFields;
private SortConfig(List<String> sortableFields) {
this.sortableFields = sortableFields;
}
public String getDefaultSortField() {
return defaultSortField;
}
public List<String> getSortableFields() {
return sortableFields;
}
}
uj5u.com熱心網友回復:
一個常見的場景是:
將“有效欄位名稱”存盤在“資料結構”中,例如:
public static final Set<String> VALID_SORT_FIELDS = Set.of("name", "studentId"/*, all we "consider valid"...*/);
然后我們可以在我們的控制器中使用它,如:
@GetMapping(value = "/get")
public Page<Student> get(@RequestParam Optional<Integer> page, @RequestParam Optional<String> sortBy) {
final String sort = sortBy
.map( s ->
s != null && VALID_SORT_FIELDS.contains(s)?
s : "name" // or a consatant com.domain.my...DEFAULT_SORT
)
.get();
return studentRepository.findAll(
PageRequest.of(page.orElse(0), 3, Sort.Direction.ASC, sort)
);
}
當我們想忽略這種情況時,我們會調整為:
...&& VALID_SORT_FIELDS.contains(s.toLowerCase(/*some (default) Locale*/))
另一種/其他可能的方法:validaion-api...但包裝Optional是一個“挑戰”(??)...
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/391912.html
上一篇:如何解決錯誤:packageorg.springframework.context.annotationdoesnotexistimportorg.springframework.context.an
