如何在Spring Boot中使用MySql数据库查询?

时间:2018-04-30 08:07:06

标签: java mysql spring spring-boot spring-data-jpa

我正在使用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);

}

4 个答案:

答案 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;
    }

    // ...

}