使用Hibernate 6访问Mendix只读副本时查询对象失败
Hibernate 6查询Mendix只读副本时抛出
EntityTypeLiteral cannot be cast to SqlExpressible异常 在Mendix应用的只读副本上使用Hibernate 6,编写实体类并初始化EntityManager后,执行对象查询时触发EntityTypeLiteral cannot be cast to class org.hibernate.metamodel.mapping.SqlExpressible类型转换异常,该问题在Postgres和HSQLDB数据库中均能复现。
相关代码
数据库表结构
CREATE TABLE "system$user"( "id" BIGINT, "name" VARCHAR(100), "submetaobjectname" VARCHAR(255) ); CREATE TABLE "administration$account"( "id" BIGINT );
查询逻辑代码
private static void retrieveAllMxUsers(final EntityManager entityManager) { final Query query = entityManager.createQuery("select System.User from System.User"); @SuppressWarnings("unchecked") final List<DbUser> objs = query.getResultList(); for (final DbUser obj : objs) { System.out .println( entityManager.getMetamodel().entity(obj.getClass()).getName() + ": " + obj .getName()); } }
实体类定义
@Entity(name = mxhibernate.entities.DbUser.entityName) @Inheritance(strategy = InheritanceType.JOINED) @Table(name = "system$user") @DiscriminatorColumn(name = "submetaobjectname") public class DbUser { public static final java.lang.String entityName = "System.User"; private long id; private String name; @Column(name = "name") public String getName() { return name; } public void setName(final String aaa) { this.name = aaa; } @Id @Column(name = "id") public long getId() { return id; } public void setId(final long id) { this.id = id; } } @Entity(name = mxhibernate.entities.DbAccount.entityName) @Table(name = "administration$account") public class DbAccount extends DbUser { public static final java.lang.String entityName = "Administration.Account"; }
完整运行日志
[main] INFO com.zaxxer.hikari.HikariDataSource - MxDbConnector-HikaryCP-0 - Starting... [main] INFO com.zaxxer.hikari.pool.PoolBase - MxDbConnector-HikaryCP-0 - Driver does not support get/set network timeout for connections. (feature not supported) [main] INFO com.zaxxer.hikari.HikariDataSource - MxDbConnector-HikaryCP-0 - Start completed. contents of system$user: (id:844424930132203)(submetaobjectname:System.User)(name:Anonymous_de9f940c-b0c6-47f8-b4a7-a10b8392ed42) (id:844424930145019)(submetaobjectname:System.User)(name:MxAdmin) (id:5348024557502651)(submetaobjectname:Administration.Account)(name:demo_administrator) (id:5348024557502777)(submetaobjectname:Administration.Account)(name:demo_user) Mar 23, 2023 6:03:42 PM org.hibernate.Version logVersion INFO: HHH000412: Hibernate ORM core version 6.1.7.Final Mar 23, 2023 6:03:42 PM org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl logSelectedDialect INFO: HHH000400: Using dialect: org.hibernate.dialect.HSQLDialect Mar 23, 2023 6:03:42 PM org.hibernate.cfg.annotations.EntityBinder processJoinedDiscriminatorProperties WARN: HHH000457: Joined inheritance hierarchy [mxhibernate.entities.DbUser] defined explicit @DiscriminatorColumn. Legacy Hibernate behavior was to ignore the @DiscriminatorColumn. However, as part of issue HHH-6911 we now apply the explicit @DiscriminatorColumn. If you would prefer the legacy behavior, enable the `hibernate.discriminator.ignore_explicit_for_joined` setting (hibernate.discriminator.ignore_explicit_for_joined=true) Mar 23, 2023 6:03:43 PM org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] Known entity: Administration.Account Known entity: System.User jakarta.persistence.PersistenceException: Converting `org.hibernate.HibernateException` to JPA `PersistenceException` : Unable to extract JDBC value for position `1` at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:165) at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:374) at org.hibernate.query.sqm.internal.QuerySqmImpl.list(QuerySqmImpl.java:1073) at org.hibernate.query.Query.getResultList(Query.java:94) at mxhibernate.MendixHibernate.retrieveAllMxUsers(MendixHibernate.java:111) at mxhibernate.MendixHibernate.logUsersWithHibernate(MendixHibernate.java:97) at mxhibernate.MendixHibernate.customLogic0(MendixHibernate.java:66) at mxhibernate.MendixHibernate.customLogic(MendixHibernate.java:54) at mxhibernate.MendixHibernate.executeWithMxDataSource(MendixHibernate.java:159) at mxhibernate.MendixHibernate.main(MendixHibernate.java:49) Caused by: org.hibernate.HibernateException: Unable to extract JDBC value for position `1` at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.readCurrentRowValues(JdbcValuesResultSetImpl.java:271) at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.advance(JdbcValuesResultSetImpl.java:244) at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.processNext(JdbcValuesResultSetImpl.java:85) at org.hibernate.sql.results.jdbc.internal.AbstractJdbcValues.next(AbstractJdbcValues.java:29) at org.hibernate.sql.results.internal.RowProcessingStateStandardImpl.next(RowProcessingStateStandardImpl.java:88) at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:197) at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:33) at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:443) at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:166) at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:91) at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31) at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$0(ConcreteSqmSelectQueryPlan.java:113) at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:335) at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:276) at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:571) at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:363) ... 8 more Caused by: java.lang.ClassCastException: class org.hibernate.sql.ast.tree.expression.EntityTypeLiteral cannot be cast to class org.hibernate.metamodel.mapping.SqlExpressible (org.hibernate.sql.ast.tree.expression.EntityTypeLiteral and org.hibernate.metamodel.mapping.SqlExpressible are in unnamed module of loader 'app') at org.hibernate.sql.results.internal.SqlSelectionImpl.getJdbcValueExtractor(SqlSelectionImpl.java:60) at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.readCurrentRowValues(JdbcValuesResultSetImpl.java:263) ... 23 more [main] INFO com.zaxxer.hikari.HikariDataSource - MxDbConnector-HikaryCP-0 - Shutdown initiated... [main] INFO com.zaxxer.hikari.HikariDataSource - MxDbConnector-HikaryCP-0 - Shutdown completed.
内容的提问来源于stack exchange,提问作者basin
相关产品推荐
相关产品推荐

