jdbcTemplate ManyToOne

时间:2018-02-07 13:08:10

标签: spring jdbctemplate

jdbcTemplate返回一个空列的事务对象或null

@Entity
public class Transaction implements Serializable {

    @Id
    private long id;
    private String accountnNumber;
    private String checkNumber;
    ...

    @ManyToOne
    @JoinColumn(name = "banque_id")
    private Bank bank;
    ...
}

public List<Transaction> getFiltre(FiltreTransaction filtre) {

    //DAO
    String sql = "select * from Transaction where id = 74";
    RowMapper<Transaction> rowMapper = new BeanPropertyRowMapper<Transaction>(Transaction.class);
   return this.jdbcTemplate.query(sql, rowMapper); 
}

答案:

{
    "id": 73,
    "accountnNumber": "xxxxxxxxxxxxxxx",
    "checkNumber": "xxxxxxxxxxxxx",
    "banque": null,
}

为什么bank在数据库中为空时为空? :/

1 个答案:

答案 0 :(得分:0)

你混合了JPA和Spring的JDBCTemplateBeanPropertyRowMapper。根据{{​​1}},BeanPropertyRowMapper

  

根据从结果集元数据获取的列名称与相应属性的公共设置者的匹配来映射列值。名称可以直接匹配,也可以使用&#34; camel&#34;将名称与下划线分隔成相同的名称。情况下。

因此BeanPropertyRowMapper忽略了JPA注释,并期望结果集中的列(最可能是BANQUE_ID)与Long banqueId bean的相应Transaction属性匹配。相反,要设置bean的bank属性,它会在结果集中显示BANK列,只要它是一个简单类型:

  

为目标类中的字段提供了许多常见类型的映射,例如:String,boolean,Boolean,byte,Byte,short,Short,int,Integer,long,Long,float,Float,double,Double,BigDecimal ,java.util.Date等。

我不认为BeanPropertyRowMapper可以映射到相关实体,当在问题的代码中使用时。

这就是bank(或banque)属性为空的原因,BeanPropertyRowMapper甚至没有尝试设置它,因为结果集中没有相应的列,它是无论如何都不应该知道如何设置相关实体​​。

我建议你清除你正在做的事情的设计并决定,你使用的是JPA,Spring的JDBC模板,混合吗?