Mam taką bazę danych SQL H2:

CREATE TABLE IF NOT EXISTS dog
(
  id            BIGINT AUTO_INCREMENT PRIMARY KEY,
  name          VARCHAR(255) NOT NULL,
  ...
  breed_id      BIGINT, -- references to breed(id) (see next line
  FOREIGN KEY (breed_id) REFERENCES breed(id)
);

Należy pamiętać, że breed_id jest opcjonalny.

Aby przechowywać dane w tej bazie danych, używam czegoś takiego

@Override
public Dog save(Dog dog) {
    final String sql =
        "INSERT INTO " +
        TABLE_NAME +
        " (name, [...], breed_id)" +
        "VALUES (?, [...], ?)";

    KeyHolder keyHolder = new GeneratedKeyHolder();
    jdbcTemplate.update(connection -> {
        PreparedStatement stmt = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
        stmt.setString(1, dog.getName());
        
        [...]
        
        if (dog.getBreed() != null) {
            stmt.setLong(5, dog.getBreed().getId());
        } else {
            // leave breed_id field empty
        }
        return stmt;
    }, keyHolder);

    breed.setId(((Number)keyHolder.getKeys().get("id")).longValue());

    return breed;
}

Moje pytanie brzmi: jak opuścić pole breed_id pusty w przypadku dog.getBreed() zwraca null?

Java nie pozwolił mi ustawić stmt.setLong(5, null);, który rozumiem jako long nie zna null.

Jednak jaki jest elegancki sposób, aby to zrobić?

1
speendo 11 październik 2020, 23:47

1 odpowiedź

Najlepsza odpowiedź

@speendo - Prosimy o użyciu SetNull metody z przygotowywania przy użyciu java.sql.types jak poniżej:

if (dog.getBreed() != null) {
            stmt.setLong(5, dog.getBreed().getId());
} else {
            // leave breed_id field empty
            stmt.setNull(5, Types.NULL);
}
1
Zulfi 11 październik 2020, 21:13