【问题标题】:How to customize response from @query in springboot API如何在springboot API中自定义@query的响应
【发布时间】:2020-01-18 09:58:13
【问题描述】:

我在 SpringBoot 中的 API @query 响应有问题。

首先我将向你展示我的代码:

@RestController
@RequestMapping("/api/osoba")
public class APIController {

@Autowired
private KsiazkaRepo ksiazkaRepo;

@JsonView(OnlyName.class)
@RequestMapping(method = RequestMethod.POST, value = "/getAll")
public Ksiazka find(@RequestParam("id") int id){
    String autor = ksiazkaRepo.findInfoById(id);
    Ksiazka ksiazka = new Ksiazka();
    ksiazka.setAutor(autor);
    return ksiazka;
}

**@Repository
public interface KsiazkaRepo extends JpaRepository<Ksiazka, Integer> {

    @Query(value = "SELECT ksiazka.tytul, ksiazka.autor FROM IEci8d0gZc.ksiazka WHERE ksiazka.id_ksiazka = :id", nativeQuery = true)
    String findInfoById(@Param("id") int id);

}**

@Entity
@Validated
public class Ksiazka {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int idKsiazka;
private int idKategoria;
private String isbn;
@JsonView(OnlyName.class)
private String tytul;
@JsonView(OnlyName.class)
private String autor;
private int stron;
private String wydawnictwo;
private int rokWydania;
private String opis;


public Ksiazka(){ }

public Ksiazka(int idKsiazka, int idKategoria, String isbn, String tytul, String autor, int stron, String wydawnictwo, int rokWydania, String opis) {
    this.idKsiazka = idKsiazka;
    this.idKategoria = idKategoria;
    this.isbn = isbn;
    this.tytul = tytul;
    this.autor = autor;
    this.stron = stron;
    this.wydawnictwo = wydawnictwo;
    this.rokWydania = rokWydania;
    this.opis = opis;
}

public int getIdKsiazka() {
    return idKsiazka;
}

public void setIdKsiazka(int idKsiazka) {
    this.idKsiazka = idKsiazka;
}

public int getIdKategoria() {
    return idKategoria;
}

public void setIdKategoria(int idKategoria) {
    this.idKategoria = idKategoria;
}

public String getIsbn() {
    return isbn;
}

public void setIsbn(String isbn) {
    this.isbn = isbn;
}

public String getTytul() {
    return tytul;
}

public void setTytul(String tytul) {
    this.tytul = tytul;
}

public String getAutor() {
    return autor;
}

public void setAutor(String autor) {
    this.autor = autor;
}

public int getStron() {
    return stron;
}

public void setStron(int stron) {
    this.stron = stron;
}

public String getWydawnictwo() {
    return wydawnictwo;
}

public void setWydawnictwo(String wydawnictwo) {
    this.wydawnictwo = wydawnictwo;
}

public int getRokWydania() {
    return rokWydania;
}

public void setRokWydania(int rokWydania) {
    this.rokWydania = rokWydania;
}

public String getOpis() {
    return opis;
}

public void setOpis(String opis) {
    this.opis = opis;
}

我的界面 OnlyName 是空的。 当我像这样使用它时,我不能得到简单的响应

喜欢:

{
    "tytul": null,
    "autor": "Mistrz czystego kodu. Kodeks postępowania profesjonalnych programistów,Robert C. Martin"
}

我知道我来自@query 的回复是在字符串中,这就是为什么我只得到一个结果,但是我应该如何更改以获取所有字符串或类似的东西?也许是字符串 []?

我还可以创建 2 个不同的自定义询问 @query 并从中获取

1. imie,
2. nazwisko, 

但事实并非如此。

非常感谢您的帮助, 咻

更新

【问题讨论】:

    标签: java mysql json api spring-boot


    【解决方案1】:

    按照此处的步骤操作

    在这里,我想告诉你如何简单地做到这一点

    1. 更改查询,应该返回列表
        @Query(value = "SELECT ksiazka.tytul, ksiazka.autor FROM IEci8d0gZc.ksiazka WHERE ksiazka.id_ksiazka = :id", nativeQuery = true)
        List<String> findInfoById(@Param("id") int id); // here you can return result as list
    
    
    1. 将“public Ksiazka find”中的返回类型更改为列表
    @RestController
    @RequestMapping("/api/osoba")
    public class APIController {
    
    @Autowired
    private KsiazkaRepo ksiazkaRepo;
    
    @JsonView(OnlyName.class)
    @RequestMapping(method = RequestMethod.POST, value = "/getAll")
        public List<Ksiazka> find(@RequestParam("id") int id){
    }
    
    1. 在正文中尝试以列表形式获取结果,
    @RestController
    @RequestMapping("/api/osoba")
    public class APIController {
    
    @Autowired
    private KsiazkaRepo ksiazkaRepo;
    
    @JsonView(OnlyName.class)
    @RequestMapping(method = RequestMethod.POST, value = "/getAll")
        public List<Ksiazka> find(@RequestParam("id") int id){
         List<String> autor = ksiazkaRepo.findInfoById(id); // get result as as  list
         List<Ksiazka> ksiazkaList = new ArrayList<>(); // create list from Ksiazka 
         for (String autors : autor) { // returned result you can loop 
        Ksiazka ksiazka = new Ksiazka(); // create Object to Ksiazka
    
        ksiazka.setAutor(autors);
        ksiazkaList.add(ksiazka); //add created object to List
            }
           return ksiazkaList; // return your list
    
           }
    

    【讨论】:

    • 感谢您的帮助,Dulaj。我的代码中仍然很少有错误。首先编译器不知道“args”是什么意思。它应该是查询结果中的字符串列表?而且我不能放“ksiazka.setAutor(auto);”因为我班级中的 Autor 是字符串而不是 List。我可以使用 String.valueOf 但它仍然不起作用
    • ,你运行了吗,现在可以了吗
    • 还是一样。结果:“tytul”:空,“作者”:“Mistrz czystego kodu. Kodeks postępowania profesjonalnych programistów,Robert C. Martin”
    • 现在你可以看到,代码正在运行,它会返回列表,现在只需检查你的数据库因为当你传递ID时,它不应该与一行相关,它应该与评论相关然后它将全部返回
    • 查看第一篇文章。我从 db 添加了屏幕的外观
    猜你喜欢
    • 2019-07-05
    • 2017-06-23
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2021-04-14
    相关资源
    最近更新 更多