Spring Data Repository忽略了Hibernate的@Convert

时间:2018-09-05 09:00:06

标签: java spring hibernate spring-data-jpa

我有以下本地查询:

@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),它会起作用。但是由于某种原因,尽管调用此查询,spring数据会忽略@Convert注释,并且不会为字段 updateDateTime 调用转换器,尽管它在后台使用了休眠查询。我猜是因为它是本机查询,所以休眠只了解数据库列,而不了解实体字段。在执行本机查询时,如何告诉spring和hibernate如何使用我的转换器的任何想法。

1 个答案:

答案 0 :(得分:0)

我应用了以下解决方法。我已经为我的功能添加了弹簧评估上下文这样的功能:

@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);

对我有用。希望这会帮助某人。