我有以下兩個物體:
@Entity
@Table(name = "organization")
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class Organization {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
Long id;
@Column(name = "name")
String name;
@OneToMany(mappedBy = "organization")
Set<Team> teams;
}
@Entity
@Table(name = "team")
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
Long id;
@Column(name = "name")
String name;
@Column(name = "description")
String description;
@ManyToOne
@JoinColumn(name="organization_id", nullable=false)
Organization organization;
}
以及這些物體的以下兩個存盤庫
@Repository
public interface OrganizationRepo extends CrudRepository<Organization, Long> {
}
@Repository
public interface TeamRepo extends CrudRepository<Team, Long> {
Optional<Set<Team>> findByOrganizationId(Long organizationId);
Optional<Team> findByOrganizationIdAndTeamId(Long organizationId, Long teamId);
}
然后我嘗試將該findByOrganizationId(..)方法與一個不存在的組織ID 一起使用,并希望它回傳一個空的可選,但我得到了一個 HashSet<> 與 0 個專案?有沒有辦法用 JPA 方法完成這個功能?
@Autowired
TeamRepo repository;
@ResponseBody
@GetMapping(value = "/api/v1/organization/{organizationId}/team")
ResponseEntity<Iterable<Team>> index(@PathVariable Long organizationId) {
Optional<Set<Team>> result = repository.findByOrganizationId(organizationId);
if(result.isPresent()) {
return new ResponseEntity<>(result.get(), HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
編輯:Organization到Teams是一個一對多的關系,這是合理的,如果沒有Organization,它應該回傳一個空的Optional<>,但如果有一個Organization有0人以上的團隊,它應該回傳一個Optional<>帶有Set<>零支或更多的球隊。
uj5u.com熱心網友回復:
當您使用集合作為結果時,您不需要將其包裝在 Optional 中,您可以直接使用 isEmpty() 方法檢查集合:
@Repository
public interface TeamRepo extends CrudRepository<Team, Long> {
Set<Team> findByOrganizationId(Long organizationId);
Optional<Team> findByOrganizationIdAndTeamId(Long organizationId, Long teamId);
}
@Autowired
TeamRepo repository;
@ResponseBody
@GetMapping(value = "/api/v1/organization/{organizationId}/team")
ResponseEntity<Iterable<Team>> index(@PathVariable Long organizationId) {
Set<Team> result = repository.findByOrganizationId(organizationId);
if(!result.isEmpty()) {
return new ResponseEntity<>(result, HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
Effective Java 一書指出: 容器型別,包括集合、映射、流、陣列和可選項,不應包含在可選項中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/385698.html
