jdbcTemplate – 留空字段

huangapple go评论96阅读模式
英文:

jdbcTemplate - leave field empty

问题

  1. 我有一个像这样生成的 H2 SQL 数据库:
  2. CREATE TABLE IF NOT EXISTS dog
  3. (
  4. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  5. name VARCHAR(255) NOT NULL,
  6. ...
  7. breed_id BIGINT, -- 引用 breed(id)(见下一行)
  8. FOREIGN KEY (breed_id) REFERENCES breed(id)
  9. );
  10. 请注意,`breed_id` 是可选的。
  11. 要在此数据库中存储数据,我使用类似以下的代码:
  12. @Override
  13. public Dog save(Dog dog) {
  14. final String sql =
  15. "INSERT INTO " +
  16. TABLE_NAME +
  17. " (name, [...], breed_id)" +
  18. " VALUES (?, [...], ?)";
  19. KeyHolder keyHolder = new GeneratedKeyHolder();
  20. jdbcTemplate.update(connection -> {
  21. PreparedStatement stmt = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
  22. stmt.setString(1, dog.getName());
  23. [...]
  24. if (dog.getBreed() != null) {
  25. stmt.setLong(5, dog.getBreed().getId());
  26. } else {
  27. // 将 breed_id 字段保留为空
  28. }
  29. return stmt;
  30. }, keyHolder);
  31. breed.setId(((Number)keyHolder.getKeys().get("id")).longValue());
  32. return breed;
  33. }
  34. 我的问题是,如果 `dog.getBreed()` 返回 `null`,该如何将 `breed_id` 字段保留为空?
  35. Java 不允许我设置 `stmt.setLong(5, null);`,我理解这是因为 `long` 类型不支持 `null`
  36. 然而,有什么优雅的方法可以实现这一点呢?
英文:

I have an H2 SQL database generated like this:

  1. CREATE TABLE IF NOT EXISTS dog
  2. (
  3. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  4. name VARCHAR(255) NOT NULL,
  5. ...
  6. breed_id BIGINT, -- references to breed(id) (see next line
  7. FOREIGN KEY (breed_id) REFERENCES breed(id)
  8. );

Note that breed_id is optional.

To store data in this database, I use something like

  1. @Override
  2. public Dog save(Dog dog) {
  3. final String sql =
  4. "INSERT INTO " +
  5. TABLE_NAME +
  6. " (name, [...], breed_id)" +
  7. "VALUES (?, [...], ?)";
  8. KeyHolder keyHolder = new GeneratedKeyHolder();
  9. jdbcTemplate.update(connection -> {
  10. PreparedStatement stmt = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
  11. stmt.setString(1, dog.getName());
  12. [...]
  13. if (dog.getBreed() != null) {
  14. stmt.setLong(5, dog.getBreed().getId());
  15. } else {
  16. // leave breed_id field empty
  17. }
  18. return stmt;
  19. }, keyHolder);
  20. breed.setId(((Number)keyHolder.getKeys().get("id")).longValue());
  21. return breed;
  22. }

My question is, how to leave the breed_id field empty in case dog.getBreed() returns null?

Java wouldn't let me set stmt.setLong(5, null); which I understand as long doesn't know null.

However, what is an elegant way to do it then?

答案1

得分: 1

  1. if (dog.getBreed() != null) {
  2. stmt.setLong(5, dog.getBreed().getId());
  3. } else {
  4. // leave breed_id field empty
  5. stmt.setNull(5, Types.NULL);
  6. }
英文:

@speendo - Kindly use setNull method of PreparedStatement with using java.sql.Types as below:

  1. if (dog.getBreed() != null) {
  2. stmt.setLong(5, dog.getBreed().getId());
  3. } else {
  4. // leave breed_id field empty
  5. stmt.setNull(5, Types.NULL);
  6. }

huangapple
  • 本文由 发表于 2020年10月12日 04:47:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/64308850.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定