如何解决JPA-Attributeconverter无法与本机查询一起使用
我创建了AttributeConverter类,该类将Enum转换为DB值并覆盖了必要的方法。 如果我使用如下所示的JPA查询,则将调用转换器并获得正确的结果。
@Query(value = "select * from driver where status=:status",nativeQuery = true)
public List<Driver> findByStatus1(DriverStatus status);
但是,如果我与查询注释一起使用,则不会调用AttributeConverter。我有一个更复杂的查询,我需要在Attribute Converter中使用本机查询,但不适用于我。
@Converter(autoApply = true)
public class DriverStatusConverter implements AttributeConverter<DriverStatus,String> {
@Override
public String convertToDatabaseColumn(DriverStatus driverStatus) {
if (driverStatus == null) {
return null;
}
System.err.println("from converter" +driverStatus.getCode());
return driverStatus.getCode();
}
@Override
public DriverStatus convertToEntityAttribute(String code) {
if (code == null) {
return null;
}
return Stream.of(DriverStatus.values()).filter(c -> c.getCode().equals(code)).findFirst()
.orElseThrow(IllegalArgumentException::new);
}
}
有什么办法可以处理这个要求?
更新1 -以下是转换器代码
{{1}}
解决方法
遇到类似的问题,找不到满意的解决方案,所以不得不求助于丑陋的黑客......存储库方法签名更改如下:
public List<Driver> findByStatus1(Integer status);
...被这样称呼:
repository.findByStatus1(DriverStatus.YOUR_DESIRED_STATUS.getCode());
是的,它很丑,而且有点违背了 AttributeConverter 的目的,但至少它是有效的。在我的特殊情况下,我不得不仅通过一个本机查询来采取此类措施。 AttributeConverter 仍然适用于所有其他 JPA 查询。
,删除nativeQuery = true
并尝试。
@Query(value = "select * from driver where status=:status")
public List<Driver> findByStatus1(DriverStatus status);
或者,您可以尝试像这样使用entityManager
-
这只是示例代码。
TypedQuery<Trip> q = entityManager.createQuery("SELECT t FROM Trip t WHERE t.vehicle = :v",Trip.class);
q.setParameter("v",Vehicle.PLANE);
List<Trip> trips = q.getResultList();
参考- https://thorben-janssen.com/jpa-21-type-converter-better-way-to/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。