如何修改json响应?

时间:2019-09-18 09:09:22

标签: java json api spring-boot spring-data-jpa

我无法在API中过滤数据库查询结果。

也许我会先介绍我的代码,然后再解释我的意思。

    @Entity
    @Validated
    public class Ksiazka {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int idKsiazka;
    private int idKategoria;
    private String isbn;
    @JsonView(DoubleName.class)
    private String tytul;
    @JsonView(DoubleName.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;
    }
}

@JsonView(DoubleName.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
}

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

    @Query(value = "SELECT ksiazka.tytul, ksiazka.autor FROM IEci8d0gZc.ksiazka WHERE ksiazka.rok_wydania = :id", nativeQuery = true)
    List<String> findInfoById(@Param("id") int id); // here you

}

enter image description here


说到重点。

通过创建这样的查询(例如“ rok_wydania” = 2014),您将获得以下形式的结果:

[
    {
        "tytul": null,
        "autor": "Język C++. Kompendium wiedzy,Bjarne Stroustrup"
    },
    {
        "tytul": null,
        "autor": "Kali Linux. Testy penetracyjne,Joseph Muniz, Aamir Lakhani"
    },
    {
        "tytul": null,
        "autor": "Praca z zastanym kodem. Najlepsze techniki,Michael Feathers"
    },
    {
        "tytul": null,
        "autor": "Tajemnice JavaScriptu. Podręcznik ninja,John Resig, Bear Bibeault"
    },
    {
        "tytul": null,
        "autor": "Java EE 6. Tworzenie aplikacji w NetBeans 7,David R. Heffelfinger"
    },
    {
        "tytul": null,
        "autor": "Projektowanie stron internetowych. Przewodnik dla początkujących webmasterów po HTML5, CSS3 i grafice. Wydanie IV,Jennifer Niederst Robbins"
    }
]

一切都很酷,因为它从数据库中提取了我需要的数据,但是JSON中的答案并不是我想要的。 如何检查答案是否分为2。从某种意义上说,标题“ title”落在该位置,作者相应地落在“ author”位置。 要使其看起来像这样:

[
    {
        "tytul": "Język C++. Kompendium wiedzy",
        "autor": ",Bjarne Stroustrup"
    },
    {
        "tytul": "Kali Linux. Testy penetracyjne",
        "autor": "Joseph Muniz, Aamir Lakhani"
    },
    {
        "tytul": "Praca z zastanym kodem. Najlepsze techniki",
        "autor": "Michael Feathers"
    },
    {
        "tytul": "Tajemnice JavaScriptu. Podręcznik ninja",
        "autor": "John Resig, Bear Bibeault"
    },
    {
        "tytul": "Java EE 6. Tworzenie aplikacji w NetBeans 7",
        "autor": "David R. Heffelfinger"
    },
    {
        "tytul": "Projektowanie stron internetowych. Przewodnik dla początkujących webmasterów po HTML5, CSS3 i grafice. Wydanie IV",
        "autor": "Jennifer Niederst Robbins"
    }
]

任何想法都应该改变什么? :D 谢谢, SM

2 个答案:

答案 0 :(得分:0)

尝试通过ID查找您的实体(ksiazka)。

Optional<Ksiazka> maybeKsiazka = Optional.ofNullable(ksiazkaRepo.findOne(id));
if (maybeKsiazka.isPresent() {
     return maybeKsiazka.get();
}

如果要在单独的查询中执行此操作,则可以查询tytul,如下所示

@Query(value = "SELECT k.tytul FROM Ksiazka k WHERE k.idKsiazka= :id")
Optional<String> findTytulById(@Param("id") int id); 

答案 1 :(得分:0)

问题在于您永远不会在循环中设置标题,因此它为空

为了说明,

VALUE
 : QUOTATION ~["\r\n]* QUOTATION
 ;

您需要将findInfo方法的返回类型调整为一个类,该类具有两个与要选择的列相匹配的字段(如果要显示的全部)。否则,我不确定我是否理解为什么返回Ksiazka列表不会在JSON中显示所有其他空字段

我想这就是您的List<String> autors = ksiazkaRepo.findInfoById(id); List<Ksiazka> ksiazkaList = new ArrayList<>(); for (String a : autors) { Ksiazka ksiazka = new Ksiazka(); ksiazka.setAutor(a); ksiazka.setTitle("you're missing this data from the query result"); ksiazkaList.add(ksiazka); } 类的目的吗?如果是这样,您可以

DoubleName
相关问题