BeanPropertySqlParameterSource с аннотациями pojo

у меня есть следующее

@Data //Lombok annotation to generate getters and setters
@Entity
public class TradeLog {
    @Id
    @Column(name = "P_TRADE_ID")
    private String tradeId;
}

tradeLog.setTradeId("1");
SqlParameterSource insertParam = new BeanPropertySqlParameterSource(tradeLog);
    System.out.println(insertProc.execute(insertParam));

И я получаю эту ошибку Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: Required input parameter 'P_TRADE_ID' is missing

Я знаю, что могу сделать сопоставление непосредственно с шаблоном jdbc, но могу ли я каким-либо образом использовать аннотации сохраняемости java или что-то в этом роде, чтобы справиться с этим для меня?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
433
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Шаблон JDBC не предоставляет такой возможности, но вы можете легко использовать отражение для сканирования всех полей @Column и заполнения его значения MapSqlParameterSource, что является еще одной реализацией SqlParameterSource. Что-то вроде ниже, вы можете обернуть его в функцию для удобства:

tradeLog.setTradeId("1");

//Create MapSqlParameterSource based on tradeLog
MapSqlParameterSource param = new MapSqlParameterSource();
for(Field field :  TradeLog.class.getDeclaredFields()) {
    Column column =   field.getAnnotation(Column.class);

    if (column != null) {
        field.setAccessible(true);
        param.addValue(column.name(), field.get(tradeLog));     
    }
}

insertProc.execute(param)

Это облом. Вероятно, лучше дать моим полям грубые имена, чем использовать отражение, но спасибо за подтверждение того, что то, что я хотел, не существует.

Steve 09.07.2019 19:25

Другие вопросы по теме