jpa转换器不必要地调用“converttodatabasecolumn”会导致classcastexception

yvgpqqbh  于 2021-08-20  发布在  Java
关注(0)|答案(0)|浏览(331)

我有一个 Converter 转换 String 在数据库中存储到相应的 Enum 要素:

  1. @Converter(autoApply=true)
  2. public class DokumentTypConverter implements AttributeConverter<DokumentTypSchluessel, String> {
  3. @Override
  4. public String convertToDatabaseColumn(DokumentTypSchluessel attribute) {
  5. return attribute.getValue();
  6. }
  7. @Override
  8. public DokumentTypSchluessel convertToEntityAttribute(String dbData) {
  9. return DokumentTypSchluessel.from(dbData);
  10. }
  11. }

我有一个实体类,它有一个枚举类型的字段:

  1. @Entity
  2. @Table(name="REF_DOKUMENTTYPEN")
  3. public class DokumentTyp {
  4. private DokumentTypSchluessel schluessel;
  5. // snip
  6. }

现在,当我尝试从数据库中检索该实体的示例时

  1. String query = "SELECT d FROM DokumentTyp d WHERE d.schluessel = " + VORBEREITUNG;
  2. entityManager.createQuery(query, DokumentTyp.class).getSingleResult();

我得到以下错误:

  1. javax.persistence.PersistenceException: An exception occurred while calling convertToDatabaseColumn on converter class de.drvbund.pub.model.convert.DokumentTypConverter with value VORBEREITUNG
  2. at org.eclipse.persistence.mappings.converters.ConverterClass.convertObjectValueToDataValue(ConverterClass.java:139)
  3. at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.getFieldValue(AbstractDirectMapping.java:778)
  4. at org.eclipse.persistence.internal.expressions.QueryKeyExpression.getFieldValue(QueryKeyExpression.java:420)
  5. at org.eclipse.persistence.internal.expressions.ConstantExpression.printSQL(ConstantExpression.java:152)
  6. at org.eclipse.persistence.expressions.ExpressionOperator.printDuo(ExpressionOperator.java:2241)
  7. at org.eclipse.persistence.internal.expressions.CompoundExpression.printSQL(CompoundExpression.java:286)
  8. at org.eclipse.persistence.internal.expressions.RelationExpression.printSQL(RelationExpression.java:899)
  9. at org.eclipse.persistence.internal.expressions.ExpressionSQLPrinter.translateExpression(ExpressionSQLPrinter.java:325)
  10. at org.eclipse.persistence.internal.expressions.ExpressionSQLPrinter.printExpression(ExpressionSQLPrinter.java:129)
  11. at org.eclipse.persistence.internal.expressions.SQLSelectStatement.printSQL(SQLSelectStatement.java:1755)
  12. at org.eclipse.persistence.internal.databaseaccess.DatabasePlatform.printSQLSelectStatement(DatabasePlatform.java:3268)
  13. at org.eclipse.persistence.platform.database.OraclePlatform.printSQLSelectStatement(OraclePlatform.java:967)
  14. at org.eclipse.persistence.internal.expressions.SQLSelectStatement.buildCall(SQLSelectStatement.java:843)
  15. at org.eclipse.persistence.internal.expressions.SQLSelectStatement.buildCall(SQLSelectStatement.java:854)
  16. at org.eclipse.persistence.descriptors.ClassDescriptor.buildCallFromStatement(ClassDescriptor.java:815)
  17. at org.eclipse.persistence.internal.queries.StatementQueryMechanism.setCallFromStatement(StatementQueryMechanism.java:390)
  18. at org.eclipse.persistence.internal.queries.StatementQueryMechanism.prepareSelectAllRows(StatementQueryMechanism.java:315)
  19. at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.prepareSelectAllRows(ExpressionQueryMechanism.java:1723)
  20. at org.eclipse.persistence.queries.ReadAllQuery.prepareSelectAllRows(ReadAllQuery.java:904)
  21. at org.eclipse.persistence.queries.ReadAllQuery.prepare(ReadAllQuery.java:835)
  22. at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:673)
  23. ... 151 more
  24. Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to de.drvbund.pub.enums.DokumentTypSchluessel

我想这个框架需要 toString() -代表 Enum 元素,假定它是需要转换为其相应dbvalue的实体属性值,并尝试调用 convertToDatabaseColumn() 方法通过 String . 我只是不知道该怎么做才对。
如何检索由 Enum jpa属性值?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题