我有我的实体类。
@Entity
@Table(name = "TABLE")
public class User {
@Id
@Column
private UUID id;
我用的是EclipseLink. 当我尝试执行以下代码时。
em.createQuery("select t from Table").getResultList();
我得到了一个异常:
Caused by: org.eclipse.persistence.exceptions.ConversionException: 异常描述:对象[9ABCC78A]是由Eclipse.persistence.exception.ConversionException引起的。在 org.eclipse.persistence.exception.ConversionException.couldNotBeConverted(ConversionException.java:78) ~[?:?] 在 org.eclipse.persistence.internal.helper.Helper.buildBytesFromHexString(Helper. java:266) ~[?:?] at org.eclipse.persistence.internal.helper.ConversionManager.convertObjectToByteArray(ConversionManager.java:326) ~[?:? DatasourcePlatform.convertObject(DatasourcePlatform.java:179) ~[?:?] at org.eclipse.persistence.internal.descriptors.ObjectBuilder.extractPrimaryKeyFromRow(ObjectBuilder.java:3104) ~[?:? buildObject(ObjectLevelReadQuery.java:805) ~[?:?] 在 org.eclipse.persistence.query.ReadAllQuery.registerResultInUnitOfWork(ReadAllQuery.java:962) ~[?:?] eclipse.persistence.query.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:573) ~[?:?] at org.eclipse.persistence.query.ObjectLevelReadQuery. executeDatabaseQuery(ObjectLevelReadQuery.java:1175) ~[?:?] at org.eclipse.persistence.query.DatabaseQuery.execute(DatabaseQuery.java:904) ~[?:?] eclipse.persistence.query.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1134) ~[?:?] at org.eclipse.persistence.query.ReadAllQuery. execute(ReadAllQuery.java:460) ~[?:?] at org.eclipse.persistence.query.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1222) ~[?:?] eclipse.persistence.internal.session.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896) ~[?:?] at org.eclipse.persistence.internal.session.AbstractSession.executeQuery(AbstractSession.java:1857) ~[? java:1839) ~[?:?] at org.eclipse.persistence.internal.session.AbstractSession.executeQuery(AbstractSession.java:1804) ~[?:?] 内部.jpa.QueryImpl.executeReadQuery(QueryImpl.java:258) ~[?:?] at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:473) ~[? 61 更多
我曾试着添加 AttributeConverter<UUID, String>
中的异常,但我得到的是同样的异常
<converter class="com.example.UuidConverter" auto-appy="true"/>
转换器中的 "技巧 "在PostgreSQL中工作得很好(我需要有 AttributeConverter<UUID, UUID>
因为JDBC驱动返回UUID),但是在MSSQL上,我没有找到有效的解决方案。
如何处理这种情况,使我的实体也支持MSSQL?
有一个小窍门,我希望这能帮助其他一些有同样问题的人。
步骤#1 创建一个类转换器
import org.eclipse.persistence.internal.helper.DatabaseField;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.mappings.DirectCollectionMapping;
import org.eclipse.persistence.mappings.converters.Converter;
import org.eclipse.persistence.sessions.Session;
import java.util.UUID;
public class MyUUIDConverter implements Converter {
@Override
public Object convertObjectValueToDataValue(Object o, Session session) {
return o;
}
@Override
public UUID convertDataValueToObjectValue(Object o, Session session) {
return (UUID) o;
}
@Override
public boolean isMutable() {
return true;
}
@Override
public void initialize(DatabaseMapping databaseMapping, Session session) {
final DatabaseField field;
if (databaseMapping instanceof DirectCollectionMapping) {
// handle @ElementCollection...
field = ((DirectCollectionMapping) databaseMapping).getDirectField();
} else {
field = databaseMapping.getField();
}
field.setSqlType(java.sql.Types.OTHER);
field.setTypeName("java.util.UUID");
field.setColumnDefinition("your column name in database");
}
}
步骤#2 使用注解转换器来实现你最近创建的类。
@Entity
@Table(name = "TABLE")
@Converter(name = "myUuidConverter", converterClass = MyUUIDConverter.class)
public class User {
步骤#3 在您的属性中使用注解转换。
@Convert("myUuidConverter")
private UUID id;