【发布时间】:2022-01-20 15:45:50
【问题描述】:
我有以下两个实体:
@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(..) 方法与一个不存在的 organizationId 一起使用,并希望它返回一个空的可选项,但我得到了一个包含 0 个项目的 HashSet?有没有一种方法可以使用 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 是OneToMany 关系,所以如果没有Organization,它应该返回一个空的Optional<>,但如果有一个具有0 个或多个团队的Organization,它应该是合理的返回一个 Optional<> 和一个 Set<> 零个或多个团队。
【问题讨论】:
标签: java spring spring-boot hibernate spring-data-jpa