休眠原生查询方法

时间:2019-08-25 21:33:14

标签: java jquery spring hibernate jpa

因此,我正在做一个分配,其中有2个实体-User and Car分别具有OneToMany关系。

因此,User将拥有Cars的列表。

我需要实现一个控制器方法,该方法将显示用户通过UserId(这是Car实体的外键)拥有的所有汽车

方法是:[GET] - /users/{id}/cars

现在,如果我只是简单地删除所有用户,那么我将得到原始的JSON smth:

{
  "id":"1",
  "name":"Taavet Prulskih",
  "cars":[{
    "Id":"1",
    "make":"BMW",
    "model":"760",
    "numberplate":"123FFF"
  },
  {
    "Id":"2",
    "make":"Opel",
    "model":"Astra",
    "numberplate":"789BFX"
  }]
}

但是我不想拥有有关User的数据,因为没有必要,因为我已经在get请求中指定了我要选择某个用户。因此,我不想只拥有某些用户拥有的汽车列表。

我正在寻找的JSON输出是:

{  
   "Id":"1",
   "make":"BMW",
   "model":"760",
   "numberplate":"123FFF"
},
{  
   "Id":"2",
   "make":"Opel",
   "model":"Astra",
   "numberplate":"789BFX"
}

ATM上有一个CarRepository,它通过以下方法扩展了JpaRepository:

@Query(value = "SELECT * FROM Cars c where c.id = :id", nativeQuery = true)
    Optional<Car> findByUserId(@Param("id") Long id);

但是由于某种原因,我收到了“ java.util.NoSuchElementException:无值”异常。尝试使用findByUserId查询方法时。

无效的控制器部分:

@GetMapping("/users/{id}/cars")
    public ResponseEntity<Car> getAllCarsByUserId(@PathVariable("id") Long id)
    {
        return ResponseEntity.ok(carRepository.findByUserId(id).get());
    }

存储库:

public interface CarRepository extends JpaRepository<Car, Long> {

    @Query(value = "SELECT * FROM Cars c where c.user_id = :id", nativeQuery = true)
    List<Car> findByUserId(@Param("id") Long id);

}

您能帮助我解决这个问题吗?

提前谢谢! :)

1 个答案:

答案 0 :(得分:0)

以下是我对您要查找的内容的理解:

存储库

@Repository
public interface CarRepository extends JpaRepository<Car, Long> {

  @Query(value = "SELECT * FROM T_CARS c where c.USER_ID = :id", nativeQuery = true)
  Collection<Car> findByUserId(@Param("id") Long id);

}

控制器

class UserController {

  @Autowired
  private CarRepository carRepository;

  @GetMapping("/users/{id}/cars")
  public ResponseEntity<Collection<Car>> getAllCarsByUserId(@PathVariable("id") Long id) {
      return ResponseEntity.ok(carRepository.findByUserId(id));
  }

}

我希望它对您有用:)