You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:03:10