Java 使用JDBC的Spring引导:嵌套对象建模

Java 使用JDBC的Spring引导:嵌套对象建模,java,postgresql,jdbc,spring-boot,nested,Java,Postgresql,Jdbc,Spring Boot,Nested,我在PostgreSQL数据库中有以下表结构,它应该是我的WebApp的数据库后端: init_db.sql 对此的基本访问是有效的(通过application.properties中定义的DataSource对象,并让Spring引导处理其余部分)。我现在很难理解如何在Spring Boot中访问/建模这个最佳版本。当前,我的模型类如下所示: ArticleType.java 和Article.java 下面的示例中,我正在构建这些类: ArticleTypeRepository.jav

我在PostgreSQL数据库中有以下表结构,它应该是我的WebApp的数据库后端:

init_db.sql

对此的基本访问是有效的(通过application.properties中定义的DataSource对象,并让Spring引导处理其余部分)。我现在很难理解如何在Spring Boot中访问/建模这个最佳版本。当前,我的模型类如下所示:

ArticleType.java



Article.java

下面的示例中,我正在构建这些类:

ArticleTypeRepository.java

@存储库
公共类ArticleTypeRepository{
@自动连线
受保护的jdbc模板jdbc;
公共ArticleType getArticleType(int id){
返回jdbc.queryForObject(“选择*FROM article.article_type,其中id=?”,articleTypeMapper,id);
}
私有静态最终行映射器articleTypeMapper=新行映射器(){
公共ArticleType mapRow(ResultSet rs,int rowNum)引发SQLException{
ArticleType ArticleType=新ArticleType();
articletype.setId(rs.getInt(“id”);
articletype.setName(rs.getString(“type_desc”);
退货类型;
}
};
对于下面的文件,我的问题出现了:

ArticleRepository.java

@存储库
公共类文章库{
@自动连线
受保护的jdbc模板jdbc;
公共文章getArticle(int-id){
返回jdbc.queryForObject(“选择*FROM article.article WHERE id=?”,articleMapper,id);
}
私有静态最终行映射器articleMapper=新行映射器(){
公共项目mapRow(ResultSet rs,int rowNum)抛出SQLException{
第条=新条款();
第条setId(rs.getInt(“id”));
article.setName(rs.getString(“名称”));
//下面这一行就是问题所在
//ArticleType at=getArticleType(Integer.parseInt(rs.getString(“type_id”)));
第条.第条类型(at);
article.setDesc(rs.getString(“说明”);
退货物品;
}
};
在本文中获取ArticleType的最佳实践是什么?检索这些对象的最佳实践是什么?还是我应该在Article对象中使用一个纯字符串对象,并用视图或其他东西查询它?我在internet上查找“Spring Boot JDBC嵌套对象Java访问建模”诸如此类,但找不到关于这个具体问题的任何真正的提示或教程,这让我怀疑我是否在做一些概念上完全错误的事情。任何提示都是值得赞赏的(教程、博士、范例如何正确地做这件事,等等)

我将在这里重复post的答案,因为它让我开始工作,直到我切换到Hibernate/JPA:


通过创建一个返回所需一切的查询 连接两个表的语句


为什么不使用Spring Data JPA呢?Spring Data JPA是Spring Boot中的一种标准方法,它创建一个查询,返回您需要的所有内容。编写一个select语句,将两个表连接起来。
CREATE TABLE article (
    id integer NOT NULL,
    name character varying NOT NULL,
    type_id integer NOT NULL
);
CREATE TABLE article_type (
    id integer NOT NULL,
    type_desc character varying NOT NULL
);
ALTER TABLE ONLY article
ADD CONSTRAINT 
    article_type_id_fkey FOREIGN KEY (type_id) REFERENCES article_type(id);
public class ArticleType {
    private Integer id;
    private String name;

    // Getters and Setters
}
public class Article {
    private Integer id;
    private String name;
    private String desc;
    private ArticleType article_type;

    // Getters and Setters
}
@Repository
public class ArticleTypeRepository {

    @Autowired
    protected JdbcTemplate jdbc;

    public ArticleType getArticleType(int id) {
        return jdbc.queryForObject("SELECT * FROM article.article_type WHERE id=?", articleTypeMapper, id);
    }

    private static final RowMapper<ArticleType> articleTypeMapper = new RowMapper<ArticleType>() {
        public ArticleType mapRow(ResultSet rs, int rowNum) throws SQLException {
            ArticleType articletype = new ArticleType();
            articletype.setId(rs.getInt("id"));
            articletype.setName(rs.getString("type_desc"));
            return articletype;
        }
    };
@Repository
public class ArticleRepository {

    @Autowired
    protected JdbcTemplate jdbc;

    public Article getArticle(int id) {
        return jdbc.queryForObject("SELECT * FROM article.article WHERE id=?", articleMapper, id);
    }

    private static final RowMapper<Article> articleMapper = new RowMapper<Article>() {
        public Article mapRow(ResultSet rs, int rowNum) throws SQLException {           
            Article article = new Article();
            article.setId(rs.getInt("id"));
            article.setName(rs.getString("name"));
            // The following line is the one in question
            // ArticleType at = getArticleType(Integer.parseInt(rs.getString("type_id")));
            article.setArticle_type(at);
            article.setDesc(rs.getString("description"));
            return article;
        }
    };