【问题标题】:org.hibernate.query.sqm.ParsingException: Could not interpret dot-ident : brandIdorg.hibernate.query.sqm.ParsingException:无法解释点标识符:brandId
【发布时间】:2026-01-20 18:40:01
【问题描述】:

我正在学习 Hibernate,但是当我尝试使用 brandId 进行过滤时,我不断收到以下错误:

GRAVE: El Servlet.service() para el servlet [Jersey Web Application] en el contexto con ruta [/restAppJSON] lanzó la excepción [org.hibernate.query.sqm.InterpretationException:错误解释查询 [from products where brandId = 5];这可能表示语义(用户查询)问题或解析器中的错误] con causa raíz org.hibernate.query.sqm.ParsingException:无法解释点标识符:brandId 在 org.hibernate.query.hql.internal.BasicDotIdentifierConsumer$BaseLocalSequencePart.resolvePathPart(BasicDotIdentifierConsumer.java:225) 在 org.hibernate.query.hql.internal.BasicDotIdentifierConsumer.consumeIdentifier(BasicDotIdentifierConsumer.java:94) 在 org.hibernate.query.hql.internal.SemanticQueryBuilder.visitDotIdentifierSequence(SemanticQueryBuilder.java:2725) 在 org.hibernate.query.hql.internal.SemanticQueryBuilder.visitGeneralPathFragment(SemanticQueryBuilder.java:2662) 在 org.hibernate.query.hql.internal.SemanticQueryBuilder.visitGeneralPathFragment(SemanticQueryBuilder.java:149) 在 org.hibernate.grammars.hql.HqlParser$GeneralPathFragmentContext.accept(HqlParser.java:2947) 在 org.hibernate.query.hql.internal.SemanticQueryBuilder.visitPath(SemanticQueryBuilder.java:2654) 在 org.hibernate.query.hql.internal.SemanticQueryBuilder.visitPath(SemanticQueryBuilder.java:149) 在 org.hibernate.grammars.hql.HqlParser$PathContext.accept(HqlParser.java:2745) 在 org.hibernate.query.hql.internal.SemanticQueryBuilder.visitPathExpression(SemanticQueryBuilder.java:761) 在 org.hibernate.grammars.hql.HqlParser$PathExpressionContext.accept(HqlParser.java:5232) 在 org.hibernate.query.hql.internal.SemanticQueryBuilder.visitEqualityPredicate(SemanticQueryBuilder.java:1144) 在 org.hibernate.query.hql.internal.SemanticQueryBuilder.visitEqualityPredicate(SemanticQueryBuilder.java:149) 在 org.hibernate.grammars.hql.HqlParser$EqualityPredicateContext.accept(HqlParser.java:4310) 在 org.hibernate.query.hql.internal.SemanticQueryBuilder.visitWhereClause(SemanticQueryBuilder.java:1070) 在 org.hibernate.query.hql.internal.SemanticQueryBuilder.visitWhereClause(SemanticQueryBuilder.java:149) 在 org.hibernate.grammars.hql.HqlParser$WhereClauseContext.accept(HqlParser.java:4086) 在 org.hibernate.query.hql.internal.SemanticQueryBuilder.visitQuerySpec(SemanticQueryBuilder.java:400) 在 org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSelectStatement(SemanticQueryBuilder.java:262) 在 org.hibernate.query.hql.internal.SemanticQueryBuilder.visitStatement(SemanticQueryBuilder.java:214) 在 org.hibernate.query.hql.internal.SemanticQueryBuilder.buildSemanticModel(SemanticQueryBuilder.java:161) 在 org.hibernate.query.hql.internal.StandardHqlTranslator.translate(StandardHqlTranslator.java:47) 在 org.hibernate.internal.AbstractSharedSessionContract.lambda$createQuery$1(AbstractSharedSessionContract.java:621) 在 org.hibernate.query.internal.QueryInterpretationCacheStandardImpl.resolveHqlInterpretation(QueryInterpretationCacheStandardImpl.java:114) 在 org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:619) 在 org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:603) 在 org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:97) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:351) 在 com.sun.proxy.$Proxy64.createQuery(未知来源) 在 com.edo.showroom.hibernate.DAO.ProductDAO.getProductsByBrand(ProductDAO.java:21) 在 com.edo.showroom.service.ProductService.getProductsByBrand(ProductService.java:13) 在 com.edo.showroom.resources.Products.getProductsByBrand(Products.java:20) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52) 在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:124) 在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:167) 在 org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:219) 在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:79) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:469) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:391) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:80) 在 org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:253) 在 org.glassfish.jersey.internal.Errors$1.call(Errors.java:248) 在 org.glassfish.jersey.internal.Errors$1.call(Errors.java:244) 在 org.glassfish.jersey.internal.Errors.process(Errors.java:292) 在 org.glassfish.jersey.internal.Errors.process(Errors.java:274) 在 org.glassfish.jersey.internal.Errors.process(Errors.java:244) 在 org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265) 在 org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:232) 在 org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:680) 在 org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394) 在 org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:366) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:319) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Unknown Source)

这是我在 mysql 中的 2 个表

创建表brands ( brandId int(11) NOT NULL AUTO_INCREMENT, brandName varchar(45) 非空, 主键 (brandId), 唯一键brandid_UNIQUE (brandId) ) ENGINE=InnoDB AUTO_INCREMENT=9 默认字符集=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

创建表products ( productId int(11) NOT NULL AUTO_INCREMENT, brandId int(11) 默认为空, productname varchar(45) 默认为空, category varchar(45) 默认为空, cost 双默认空值, 主键 (productId), 键brandid_idx (brandId), 约束 brandid 外键 (brandId) 参考 brands (brandId) ) ENGINE=InnoDB AUTO_INCREMENT=5 默认字符集=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

这些是我的实体类:

@Entity(name = "products")
@Table(name = "products")
public class ProductEntity {

@Id
@Column(name = "productId")
private int productId;

@ManyToOne(targetEntity = BrandEntity.class)
@JoinColumn()
private BrandEntity brandEntity;

@Column(name = "productname")
private String productName;

@Column(name = "category")
private String category;

@Column(name = "cost")
private double cost;

public ProductEntity() {
}

+getter 和 setter

@Entity(name = "brands")
@Table(name = "brands")
public class BrandEntity {
    @Id
@Column(name = "brandId")
private Integer brandId;

@Column(name = "brandName")
private String brandName;

public BrandEntity() {
}

我的 DAO 类是这样的:

public class ProductDAO {

SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(ProductEntity.class)
        .addAnnotatedClass(BrandEntity.class).buildSessionFactory();

public List<ProductEntity> getProductsByBrand(int brandId) {
    Session session = factory.getCurrentSession();
    session.beginTransaction();
    String stmt = "from products where brandId = " + brandId;
    List<ProductEntity> productList = session.createQuery(stmt).getResultList();
    return productList;
}

}

谁能告诉我我做错了什么

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    好的,我发现了问题所在,我使用的是 hibernate-core 6 Alpha 版本。我切换到 5.4.12.Final,一切都在执行,没有任何问题

    【讨论】: