Я пытаюсь использовать JOOQ без генерации кода. У меня есть класс дао, который выглядит так
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 возвращает нулевые значения. Что я здесь делаю не так? Может кто-нибудь указать мне правильное направление? Я был бы очень признателен за любую помощь.
Я не уверен, является ли это ошибка или особенность. Вы используете простой API шаблонов SQL, тогда как вам, вероятно, следует использовать API построения идентификатора. Когда ты пишешь
field("tiedosto.id")
Затем jOOQ (возможно, ошибочно) считает, что ваш столбец называется `tiedosto.id`
с точкой в имени. Когда его действительно следует квалифицировать как `tiedosto`.`id`
. Есть несколько возможных исправлений:
Но тогда не уточняйте имя:
field("id")
field(name("tiedosto", "id"))
Конечно, это всегда должно быть вашим предпочтительным вариантом.
Большое спасибо за ваш ответ. Удаление имени таблицы помогло. Я обычно и в основном предпочитаю генератор кода, я просто пытался немного поиграться с jooq.