首页 > 解决方案 > @Query 不断从数据库中提取空值

问题描述

我目前有我想称之为代码块(编写器块但带有编码)的东西。我尝试过多次检查并确保一切都在正确的位置,但是尽管我在@Query 中询问的数据存在,但它一直让我为空。

这是我目前拥有的@Query,

@Query(value = "select d.denda from data_transaksi_model d WHERE d.tanggal=:x AND d.nama_wp = :y AND d.masa_pajak=:z", nativeQuery = true)
    String findAllDenda(String x,String y,String z);

我的预期输出是“data_transaksi_model”表中的“denda”集合,其中包含该表中的特定“tanggal”、“name”和“masa_pajak”。我已经仔细检查了在数据库中创建的表,它与我在那里查询的名称相同,

在此处输入图像描述

正如你所看到的,表名是匹配的,并且在我的查询中具有我想要的名称的列名的名称也是匹配的。为了确定,我还检查了数据库的结构,它确实是一个字符串,其他的也一样。

在此处输入图像描述

该表是我制作的 Spring Boot 项目中模型的副产品。


@Entity
public class DataTransaksiModel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @NotNull
    @Column(name = "tanggal")
    private String tanggal;

    @NotNull
    @Column(name = "no_kohir")
    private String noKohir;

    @NotNull
    @Column(name = "no_urut")
    private String noUrut;

    @NotNull
    @Column(name = "nama_wp")
    private String namaWP;

    @NotNull
    @Column(name = "jam")
    private String jam;

    @NotNull
    @Column(name = "nop")
    private String nop;

    @NotNull
    @Column(name = "denda")
    private String denda;

    @NotNull
    @Column(name = "jumlah_setoran")
    private String jumlahSetoran;

    @NotNull
    @Column(name = "luas_tanah")
    private String luasTanah;

    @NotNull
    @Column(name = "luas_bangunan")
    private String luasBangunan;

    @NotNull
    @Column(name = "kecamatan")
    private String kecamatan;

    @NotNull
    @Column(name = "kelurahan")
    private String kelurahan;

    @NotNull
    @Column(name = "masa_pajak")
    private String masaPajak;

    @NotNull
    @Column(name = "lokasi")
    private String lokasi;

    @NotNull
    @Column(name = "pokok")
    private String pokok;

    @NotNull
    @Column(name = "cabang")
    private String cabang;

    @NotNull
    @Column(name = "User")
    private String user;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getTanggal() {
        return tanggal;
    }

    public void setTanggal(String tanggal) {
        this.tanggal = tanggal;
    }

    public String getNoKohir() {
        return noKohir;
    }

    public void setNoKohir(String noKohir) {
        this.noKohir = noKohir;
    }

    public String getNoUrut() {
        return noUrut;
    }

    public void setNoUrut(String noUrut) {
        this.noUrut = noUrut;
    }

    public String getNamaWP() {
        return namaWP;
    }

    public void setNamaWP(String namaWP) {
        this.namaWP = namaWP;
    }

    public String getJam() {
        return jam;
    }

    public void setJam(String jam) {
        this.jam = jam;
    }

    public String getNop() {
        return nop;
    }

    public void setNop(String nop) {
        this.nop = nop;
    }

    public String getDenda() {
        return denda;
    }

    public void setDenda(String denda) {
        this.denda = denda;
    }

    public String getJumlahSetoran() {
        return jumlahSetoran;
    }

    public void setJumlahSetoran(String jumlahSetoran) {
        this.jumlahSetoran = jumlahSetoran;
    }

    public String getLuasTanah() {
        return luasTanah;
    }

    public void setLuasTanah(String luasTanah) {
        this.luasTanah = luasTanah;
    }

    public String getLuasBangunan() {
        return luasBangunan;
    }

    public void setLuasBangunan(String luasBangunan) {
        this.luasBangunan = luasBangunan;
    }

    public String getKecamatan() {
        return kecamatan;
    }

    public void setKecamatan(String kecamatan) {
        this.kecamatan = kecamatan;
    }

    public String getKelurahan() {
        return kelurahan;
    }

    public void setKelurahan(String kelurahan) {
        this.kelurahan = kelurahan;
    }

    public String getMasaPajak() {
        return masaPajak;
    }

    public void setMasaPajak(String masaPajak) {
        this.masaPajak = masaPajak;
    }

    public String getLokasi() {
        return lokasi;
    }

    public void setLokasi(String lokasi) {
        this.lokasi = lokasi;
    }

    public String getPokok() {
        return pokok;
    }

    public void setPokok(String pokok) {
        this.pokok = pokok;
    }

    public String getCabang() {
        return cabang;
    }

    public void setCabang(String cabang) {
        this.cabang = cabang;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }
}

完成后,我将一个数据虚拟对象插入到数据库中,如下所示。

在此处输入图像描述

因此,我尝试tanggal使用“1170130”、nama_wp“SURATNO”和masa_pajak“2016”输入。但是,我在集合中不断得到 null 而不是“9.166”。我哪里做错了?我正在为这个项目使用 XAMPP、MySQL 和 Spring Boot。

/编辑:我在我的 XAMPP 中使用SELECT denda FROM data_transaksi_model手动尝试了它WHERE nama_wp="SURATNO" AND masa_pajak="2014" AND tanggal="1170130",它实际上给了我一个回报

在此处输入图像描述

但是,当我在我的 Spring Boot 项目中执行此操作时,它仍然返回 null。

//Edit2:我使用 IntelliJ 作为我的 IDE,@Query 注释中有一个警告(不是错误)。据说“没有配置数据源来运行此 SQL 并提供高级代码帮助。通过问题菜单 (alt+enter) 禁用此检查”还有一个警告说,“未配置 SQL 方言”。如果这是问题的根源,如何解决?

在此处输入图像描述

///edit3:我试图修复查询,但它没有显示我想要的结果。这是我用于存储库的服务

    @Autowired
    DataTransaksiDb dataTransaksiDb;

    @Override
    public List<String> getDenda(String tanggal, String nama, String masaPajak){
        // TODO Auto-generated method stub
        return dataTransaksiDb.findAllDenda(tanggal, nama, masaPajak);
    }

这是我使用该服务的控制器。控制器正在使用一个多部分文件,其中数据是从上传的 CSV 中取出的,其中 CSV 中的表与数据库相同。

 @PostMapping("/uploadFile")
    public static void uploadFile(@RequestParam("file") MultipartFile file, HttpServletResponse response) throws IOException {
        if (file.getContentType().equalsIgnoreCase("application/vnd.ms-excel")) {
            InputStreamReader input = new InputStreamReader(file.getInputStream());
            CSVParser csvParser = CSVFormat.EXCEL.withFirstRecordAsHeader().parse(input);
            for (CSVRecord record : csvParser) {
                String nama = record.get("nama_wp");
                String masa = record.get("masa_pajak");
                String tanggal = record.get("tanggal");
                String denda = record.get("denda");
                String jumlahSetoran = record.get("jumlah_setoran");
                String pokok = record.get("pokok");
                String luasTanah = record.get("luas_tanah");
                String luasBangunan = record.get("luas_bangunan");

                try {
                    System.err.println(tanggal + "\n" + nama + "\n" + masa);
                    List<String> results = rekonsiliasiService.getDenda(tanggal, nama, masa);
                    System.err.println("results " + results);
                } catch (NullPointerException e) {
                    System.err.println(e);
                }


            }


            response.sendRedirect("/rekonsiliasi");
        } else {
            response.sendRedirect("/rekonsiliasi");
        }
    }

无论我得到的输入结果如何,它都会被 nullpointerexception 捕获

////EDIT4: 我尝试从我的控制器调试它,我尝试这样做System.err.println(rekonsiliasiService.getDenda(tanggal,nama,masa));,它让我得到一个 NullPointerException。然后我尝试查看问题是否是服务中参数本身的输入

@Override
    public List<String> getDenda(String tanggal, String nama, String masaPajak){
        // TODO Auto-generated method stub
        System.err.println("tanggal " + tanggal + "\n" + "nama " + nama + "\n" + "masaPajak " + masaPajak);
        return dataTransaksiDb.findAllDenda(tanggal, nama, masaPajak);
    }

它从未到达System.err.println("tanggal " + tanggal + "\n" + "nama " + nama + "\n" + "masaPajak " + masaPajak);我的服务层内。

标签: mysqlspring-bootxampp

解决方案


尝试这个 :

@Query(value = "select d.denda from DataTransaksiModel d WHERE d.tanggal=:x AND d.namaWP = :y AND d.masaPajak=:z")
    List<String> findAllDenda(@Param("x")String x, @Param("y")String y,@Param("z") String z);

如果它不起作用试试这个:

@Query(value = "select d.denda from data_transaksi_model d WHERE d.tanggal=:x AND d.nama_wp = :y AND d.masa_pajak=:z", nativeQuery = true)
    List<String> findAllDenda(@Param("x")String x, @Param("y")String y,@Param("z") String z);

推荐阅读