【问题标题】:How can I fetch database rows in Pojo without using JOOQ code generation?如何在不使用 JOOQ 代码生成的情况下在 Pojo 中获取数据库行?
【发布时间】:2019-04-04 11:53:39
【问题描述】:

我正在尝试使用不生成代码的 JOOQ。我有一个像这样的 dao 类

public class FilesDao { 
public List<FilePojo> getAllFiles() {
    DataSource dataSource = DataSourceFactory.getTestiDataSource();
    List<FilePojo> filePojos = new ArrayList<>();
    try (Connection con = dataSource.getConnection()) {
        DSLContext create = DSL.using(con, SQLDialect.MARIADB);
        filePojos = create.select(field("tiedosto.id"), field("tiedosto.nimi"), field("tiedosto.koko_tavua"),
                field("tiedosto.sisalto"), field("tiedosto.hlo_id"))
                .from(table("tiedosto"))
                .where(field("minioupload").eq((byte) 0))
                .fetch().into(FilePojo.class);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return filePojos;
   }
}

还有一个像这样的 Pojo 类

import javax.persistence.Column;
import javax.persistence.Table;

@Table(name="tiedosto")
public class FilePojo {

@Column(name = "id")
private Integer id;

@Column(name = "hlo_id")
private Integer customerId;

@Column(name = "koko_tavua")
private Integer fileSize;

@Column(name = "nimi")
private String fileName;

@Column(name = "sisalto")
private byte[] content;}
//Getters setters omitted

当我尝试使用这样的主要方法从表中读取数据时

public class App {
public static void main(String[] args) {
    FilesDao mydao = new FilesDao();
    List<FilePojo> myList = mydao.getAllFiles();
    for (FilePojo filePojo : myList) {
        System.out.println("==========================================" + "\n" +
                filePojo.getId() + " " +
                filePojo.getCustomerId() + " " +
                filePojo.getFileName() + " " +
                filePojo.getFileSize() + " " +
                filePojo.getContent() + " " +
                "==========================================");
    }
  }
}

输出如下

我可以看到 SQL 查询运行良好并列出了所有匹配的行,但 pojo 正在返回空值。我在这里做错了什么?有人可以指出我正确的方向吗?我非常感谢任何形式的帮助。

【问题讨论】:

    标签: java pojo jooq


    【解决方案1】:

    我不确定这是否是bug or a feature。当您可能应该使用identifier building API 时,您正在使用plain SQL templating API。当你写

    field("tiedosto.id")
    

    然后,jOOQ(可能错误地)认为您的列名为`tiedosto.id`,名称中有句点。当它真的应该被限定为`tiedosto`.`id`。有一些可能的修复:

    继续使用普通的 SQL 模板 API

    但是,不要限定名称:

    field("id")
    

    使用标识符构建 API

    field(name("tiedosto", "id"))
    

    使用代码生成器

    当然,这应该始终是您的首选。

    【讨论】:

    • 非常感谢您的回答。删除表名就可以了。我通常并且主要是更喜欢代码生成器,我只是想玩一点 jooq。
    猜你喜欢
    • 2020-07-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2021-09-15
    • 2021-06-26
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多