我的应用程序中有两个表-ResidentVehicle,如下所示:

@Entity
@Table(name = "resident")
public class Resident {

    @Id                     // PKey
    private String id;

    private Vehicle primaryVehicle;

    @ManyToMany
    private List<Vehicle> vehicles; 

    ...
}   
@Entity
@Table(name = "vehicle")
public class Vehicle {

    @Id                     // PKey
    private String id;

    private String model;

    ...
}   

这导致在My Postgres数据库中创建了3个表:

resident
vehicle
resident_vehicles

所以这个额外的表resident_vehicles是自动创建的,在我的代码库中没有该表的类.

我有一个复杂的查询,它要求我使用原生查询调用该表.例如,简化的查询将是:

select vehicle_id from vehicle_currencies where vehicle_id = '<some-id>'

请注意,此查询是我想要做的事情的简化版本.我的SQL查询更复杂,最重要的是在运行时动态生成.由于我拥有的动态行为,使用JPA存储库方法非常困难.

出于我的目的,我使用Java的Native Query,如下所示:

Query query = entityManager.createQuery("select vehicle_id from vehicle_currencies where vehicle_id = '<some-id>'

List result = query.getResultList();
...

然而,这是导致错误的原因:

org.hibernate.hql.internal.ast.QuerySyntaxException: resident_vehicles is not mapped
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:170) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:91) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:77) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:334) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3782) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3671) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
...

如何解决此错误?

推荐答案

问题出在这条线路上

Query query = entityManager.createQuery("select vehicle_id from vehicle_currencies where vehicle_id = '<some-id>');

您正在try 运行native query,因为您没有任何中间表的映射,这是唯一的方法.但是当我们想要运行一个原生查询时,我们应该在EntityManager中使用createNativeQuery方法.

createQuery方法用于HQL个查询,所有指定表都需要对其进行映射,这就是出现此问题的原因

org.hibernate.hql.internal.ast.QuerySyntaxException: resident_vehicles is not mapped

您可以参考的链接以获取详细说明

  1. JPA's EntityManager createQuery() vs createNamedQuery() vs createNativeQuery()
  2. Why do we need to create native query?
  3. use of entityManager.createNativeQuery(query,foo.class)

Java相关问答推荐

编译期间错误(Java 0000)Android .Net MAUI

Spring boot:Bean和动态扩展器

使用Testcontainers与OpenLiberty Server进行集成测试会抛出SocketException

不推荐使用的Environment.getExternalStorageDirectory().getAbsolutePath()返回的值不同于新的getExternalFilesDir(空)?

为什么Java编译器不区分不同类型的方法?

Spring @Value default无法计算表达式

使用PDFBox从PDF中删除图像

通过Java列表中的某些字段搜索值

JavaFX:无论何时显示应用程序,如何更改组件/ node 位置?

如何在运行docker的应用程序中获取指定的配置文件

如何在Record Java中使用isRecord()和RecordComponent[]?

Java Flux中的延迟增加

为什么项目名称出现在我的GET请求中?

如何在Maven Central上部署?

为什么我的登录终结点不能被任何请求访问?

按长度排序字符串数组

多线程、并发和睡眠未按预期工作

Android上的SQLite:Android.database.SQLite.SQLiteReadOnlyDatabaseException:try 写入只读数据库(代码1032 SQLite_readonly_DBMOVED)

当我try 返回可选时,Mock无法正常工作

使用原子整数的共享计数器并发增量