需要Spring Data JPA资源条目才能进行多次休息调用

时间:2015-10-01 17:16:28

标签: rest jpa spring-data spring-data-jpa spring-data-rest

使用Spring Data jpa和Spring Data Rest我可以使基本的CRUD操作正常工作。但我面临着一对多(所有者 - >汽车)关系的问题。任何人都可以帮助我。

Owner.java

@Entity
@Table(name = "OWNER")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Owner implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private Integer age;

    @OneToMany(mappedBy = "owner")
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Car> cars = new HashSet<>();


}

OwnerResource.java

    @RestController
    @RequestMapping("/api")
    public class OwnerResource {    
        private final Logger log = LoggerFactory.getLogger(OwnerResource.class);    
        @Inject
        private OwnerRepository ownerRepository;    

        @RequestMapping(value = "/owners",
                method = RequestMethod.POST,
                produces = MediaType.APPLICATION_JSON_VALUE)
        @Timed
        public ResponseEntity<Owner> create(@RequestBody Owner owner) throws URISyntaxException {
            log.debug("REST request to save Owner : {}", owner);
            if (owner.getId() != null) {
                return ResponseEntity.badRequest().header("Failure", "A new owner cannot already have an ID").body(null);
            }
            Owner result = ownerRepository.save(owner);
            return ResponseEntity.created(new URI("/api/owners/" + result.getId()))
                    .headers(HeaderUtil.createEntityCreationAlert("owner", result.getId().toString()))
                    .body(result);
        }

       @RequestMapping(value = "/owners",
            method = RequestMethod.PUT,
            produces = MediaType.APPLICATION_JSON_VALUE)
        @Timed
        public ResponseEntity<Owner> update(@RequestBody Owner owner) throws URISyntaxException {
            log.debug("REST request to update Owner : {}", owner);
            if (owner.getId() == null) {
                return create(owner);
            }
            Owner result = ownerRepository.save(owner);
            return ResponseEntity.ok()
                    .headers(HeaderUtil.createEntityUpdateAlert("owner", owner.getId().toString()))
                    .body(result);
        }

       @RequestMapping(value = "/owners",
                method = RequestMethod.GET,
                produces = MediaType.APPLICATION_JSON_VALUE)
        @Timed
        public ResponseEntity<List<Owner>> getAll(@RequestParam(value = "page" , required = false) Integer offset,
                                      @RequestParam(value = "per_page", required = false) Integer limit)
            throws URISyntaxException {
            Page<Owner> page = ownerRepository.findAll(PaginationUtil.generatePageRequest(offset, limit));
            HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/owners", offset, limit);
            return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
        }

 @RequestMapping(value = "/owners/{id}",
                method = RequestMethod.GET,
                produces = MediaType.APPLICATION_JSON_VALUE)
        @Timed
        public ResponseEntity<Owner> get(@PathVariable Long id) {
            log.debug("REST request to get Owner : {}", id);
            return Optional.ofNullable(ownerRepository.findOne(id))
                .map(owner -> new ResponseEntity<>(
                    owner,
                    HttpStatus.OK))
                .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
        }

    }

OwnerRepository.java

/**
 * Spring Data JPA repository for the Owner entity.
 */
public interface OwnerRepository extends JpaRepository<Owner,Long> {    


}

基本的crud操作对于Owner来说很好。但现在我需要获取特定所有者的所有车辆,我需要在OwnerResource.java中添加一个休息呼叫条目,在OwneRepository.java中添加一个方法条目。我尝试了不同的方法,但得到了很多错误,但是没有用。以下是我的尝试。

在OwnerRepository.java中

Owner findAllByOwnerId(Long id);//But eclipse shows error here for this method

在OwnerResource.java中

//Get All Cars
    @RequestMapping(value = "/{id}/cars",
            method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_VALUE)
    @Timed
    public ResponseEntity<Owner> getAll(@PathVariable Long id) {
        log.debug("REST request to get All Cars of the Owner : {}", id);
        return Optional.ofNullable(ownerRepository.findAllByOwnerId(id))
            .map(owner -> new ResponseEntity<>(
                owner,
                HttpStatus.OK))
            .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }

但这两项改变并没有成功。我初学春天数据jpa和spring数据休息。任何人都可以帮我纠正这两个,以便我可以得到车主的所有车。

1 个答案:

答案 0 :(得分:1)

我认为它显示错误,因为findAll返回不同类型的对象:List,Page等...

试试这个:

List<Owner> findAllByOwnerId(@Param("id") Long id);

这将返回一个对象列表。如果你想用分页返回,而不是你需要它:

Page<Owner> findAllByOwnerId(@Param("id") Long id, Pageable pageable);

我希望这有帮助,让我知道它对你有用。