Spring Data Repository игнорирует @Convert Hibernate - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть следующий собственный запрос:

@Transactional
@Query(nativeQuery = true, value =
        "INSERT INTO my_entity (update_date_time) " +
        "VALUES (:#{#e.getUpdateDateTime()}) " +
        "ON CONFLICT (hash) DO NOTHING RETURNING *")
Long insert(MyEnitity e);

Вот отображение:

@Entity
@Table(name = "my_entity")
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Access(AccessType.PROPERTY)
    private Long id;    
    @Column(name = "update_date_time")
    @Convert(converter = LocalDateTimeAttributeConverter.class)
    private LocalDateTime updateDateTime;
....
}

Это работает, если я вызываю Repository.save (MyEntity). Но по какой-то причине при вызове этого запроса пружинные данные игнорируют аннотацию @Convert и не вызывают конвертер для поля updateDateTime , хотя и используют скрытый запрос изнутри. Я предполагаю, что это из-за его собственного запроса, и hibernate знает только о столбцах БД, а не о полях сущностей. Любые идеи, как сказать Spring и Hibernate, используют мой конвертер при выполнении собственного запроса.

1 Ответ

0 голосов
/ 05 сентября 2018

Я применил следующий обходной путь. Я добавил требуемую для меня функцию в контекст оценки Spring следующим образом:

@Component
public class CustomEvaluationContextExtension extends EvaluationContextExtensionSupport {

    private static final Map<String, Function> functions = new HashMap<>();

    static {
        functions.put("ldt2timestamp", createLdt2timestampFunc());
    }

    private static Function createLdt2timestampFunc() {
        Method convertToDatabaseColumn =
                ReflectionUtils.findMethod(LocalDateTimeAttributeConverter.class,
                        "convertToDatabaseColumn", LocalDateTime.class);

        return new Function(convertToDatabaseColumn,
                LocalDateTimeAttributeConverter.INSTANCE);
    }

    @Override
    public Map<String, Function> getFunctions() {
        return functions;
    }

    @Override
    public String getExtensionId() {
        return "custom";
    }

}

После того, как я позвоню ldt2timestamp следующим образом в моих запросах:

@Transactional
@Query(nativeQuery = true, value =
        "INSERT INTO my_entity (update_date_time) " +
        "VALUES (:#{#root.ldt2timestamp(#e.getUpdateDateTime())}) " +
        "ON CONFLICT (hash) DO NOTHING RETURNING *")
Long insert(MyEntity e);

Это работает для меня. Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...