我有以下本地查询:
@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如何使用我的转换器的任何想法。
答案 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);
对我有用。希望这会帮助某人。