【问题标题】:table "" does not exist, skipping, table is not mapped表“”不存在,跳过,表未映射
【发布时间】:2020-05-18 12:37:18
【问题描述】:

我正在尝试使用 postgres 在 Spring Boot 上构建应用程序。我正在使用 docker-compose。 我尝试访问数据时出错 这是例外

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: table is not mapped [SELECT t FROM table t WHERE t.code = :code]
app_1         |     at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:138)
app_1         |     at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
app_1         |     at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
app_1         |     at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:718)
app_1         |     at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:809)
app_1         |     at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23)

方法表存储库

    public Table getDataByCode(String tc) {
        try {
            TypedQuery<Table> q = em.createQuery("SELECT t FROM table t WHERE t.code = :code", Table.class);
            q.setParameter("code", tc);
            return q.getSingleResult();
        } catch (Exception exception) {
            exception.printStackTrace();
            return null;
        }
    }

函数被调用 表 t = tableRepository.getDataByCode("CCC");

我的实体表

package hello.world.entity;
import javax.persistence.*;

@Entity
@Table(name="table")
public class Table {
    @Id
    @Column(name="code", length=3, nullable=false)
    private String code;

    @Column(name="name", length=256, nullable=false)
    private String name;

    public Table() {
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

【问题讨论】:

  • 您好,您应该提供更多信息。比如Spring Boot的Controller/Service类,Entity类,也许是数据库表的结构。您使用 docker-compose 的目的是什么?您应该添加更多详细信息,因为您的请求过于笼统。
  • @A.Wolf 我编辑了帖子
  • 应用程序是否连接到数据库?您是否尝试过findAll()?请同时添加您的存储库的代码。
  • 我建议您将实体名称从 table 更改为另一个名称,因为它似乎是一个保留名称,可能很危险。

标签: java postgresql hibernate spring-boot docker


【解决方案1】:

您可以从具有实现JpaRepository 接口的特定字段并使用findByField(...) 定义的表中执行SELECT,其中Field 是您要在@987654326 中添加的实际字段的名称@ 子句。
如果要通过代码进行选择,可以执行以下操作:

@Repository
public interface TableRepository extends JpaRepository<Table, String> {

    List<Table> findByCode(String code);

}

这样你就不用添加代码的实现了,Jpa 会帮你搞定的。
然后你可以这样简单地调用它:

Table t = tableRepository.findByCode("CCC");

请记住,您应该在 application.properties 文件中包含一些类似这样的属性来连接到您的数据库:

## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres_demo
spring.datasource.username= rajeevkumarsingh
spring.datasource.password=

# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update

您可以在this article for example 中找到。

如果您需要更多信息,请告诉我。

【讨论】:

  • 如何检查应用是否连接到 postgres?
  • 您应该在日志文件中看到它。做一个简单的检查,直接在数据库上的表中添加一些数据并调用tableRepository.findAll()。它将返回这些结果。
  • 我认为我的应用程序没有连接到 postgre,当我执行 docker run postgres 时,控制台上有一条消息 listening on IPv4 address "0.0.0.0", port 5432 .应该是 127.0.0.0:5432 吗?
  • 您还应该添加 docker-compose 文件。您的 Spring Boot 应用程序是否在另一个容器中?
  • 是的,我有 docker compose 文件。是的,弹簧靴在另一个容器中
猜你喜欢
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
相关资源
最近更新 更多