我正在使用spring boot创建一个API。在这个项目中,我使用spring web,JPA,jstl和MySql作为API的依赖项。在这个项目中,我创建了一个Controller,Model和Repository。基本上,此API执行CRUD操作。当我使用GET请求时,我想只获得3列。但是,案例是我在这里使用JPA而且我不知道如何使用自定义查询,如
" SELECT devname,hrs,ot FROM imaginaryTable"
。
我该怎么做?
我的控制器类。
@RestController
@RequestMapping("/api")
public class ImController {
@Autowired
private ImRepository TaskRepository;
@GetMapping("/projects")
public List<ImModel> findAll() {
return (List<ImModel>) TaskRepository.findAll();
}
@GetMapping("/developers/{id}")
public ImModel findByName(@PathVariable final int id){
return TaskRepository.findById(id);
}
}
我的存储库界面。
package com.kisalka.pacrestapi.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.kisalka.pacrestapi.model.ImModel;
public interface ImRepository extends JpaRepository<ImModel, Integer> {
ImModel findById(int id);
}
答案 0 :(得分:1)
您可以在存储库中使用@Query("Your query")
注释来查询数据库。
例如
@Query(value="SELECT devname,hrs,ot FROM imaginaryTable",nativeQuery=true)
private List<Object> getValues();
希望它能解决你的问题。
答案 1 :(得分:0)
您可以使用Spring对Jackson JSONView的支持来自定义Controller中实体的JSON表示。
https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring#json-views
@JsonView(View.Summary.class)
@GetMapping("/developers/{id}")
public ImModel findByName(@PathVariable final int id){
return TaskRepository.findById(id);
}
或者,您可以使用Spring Data的投影功能在存储库级别处理:
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections
@GetMapping("/developers/{id}")
public ImModelSummaryProjection findByName(@PathVariable final int id){
return TaskRepository.someMethodReturningSummaryProjection(id);
}
答案 2 :(得分:0)
如Spring Docs中所述: 的 Interface-based projections 强> 限制查询结果以公开名称属性的最简单方法是声明一个接口,该接口将公开要读取的属性的访问器方法。
您可以创建interface
来限制结果
interface LimitImaginaryTable {
String getDevname();
String getHrs();
String getOt();
}
然后在repository
中,您可以使用该界面获得有限的结果
public interface ImRepository extends JpaRepository<ImModel, Integer> {
ImModel findById(int id);
LimitImaginaryTable findById(int id);
List<LimitImaginaryTable> findByDevname(String name);
}
现在,您只需在Controller
List<LimitImaginaryTable> myList = taskRepository.findByDevname("JavaDev");
答案 3 :(得分:0)
您可以使用列作为构造函数的参数来创建对象。
我将通过我制作的自定义DTO给你一个我自己的例子:
@Query("SELECT new org.twinnation.site.dto.TitleAndDescriptionAndId(a.title, a.description, a.id) "
+ "FROM Article a")
List<TitleAndDescriptionAndId> getAllArticlesWithoutContent();
DTO TitleAndDescriptionAndId
如下:
public class TitleAndDescriptionAndId {
private String title;
private String description;
private Long id;
public TitleAndDescriptionAndId(String title, String description, Long id) {
this.title = title;
this.description = description;
this.id = id;
}
// ...
}