Java org.postgresql.util.PSQLException:错误:关系不存在PreparedStatement.executeQuery()

Java org.postgresql.util.PSQLException:错误:关系不存在PreparedStatement.executeQuery(),java,spring,postgresql,hibernate,Java,Spring,Postgresql,Hibernate,出于某种奇怪的原因,hibernate生成的查询不适用于postgres,它告诉我们,即使在dvdreart模式中存在有效的表film\u actor,它也找不到关系/表?这没有帮助 例外情况: org.postgresql.util.PSQLException : ERROR : relation "dvdrental.film_actor" does NOT exist PreparedStatement.executeQuery () FAILED ! SELECT * FRO

出于某种奇怪的原因,hibernate生成的查询不适用于postgres,它告诉我们,即使在
dvdreart
模式中存在有效的表
film\u actor
,它也找不到关系/表?这没有帮助

例外情况:

org.postgresql.util.PSQLException : ERROR : relation "dvdrental.film_actor" does NOT exist PreparedStatement.executeQuery () FAILED ! 
SELECT
    *
FROM
film f
INNER JOIN film_actor fa ON f.film_id = fa.film_id
LIMIT 100;
HQL

Query searchQuery = session.createQuery("select film from Film as film " +
                    "inner join film.actors  as a " +
                    "inner join film.categories as c " +
                    "where c.categoryId=:categoryId " +
                    "and film.language.id=:languageId " +
                    "and film.releaseYear=:releaseYear " +
                    "and a.actorId=:actorId");
SELECT
    film0_.film_id AS film_id1_8_,
    film0_.description AS descript2_8_,
    film0_.language_id AS languag12_8_,
    film0_.last_update AS last_upd3_8_,
    film0_. LENGTH AS length4_8_,
    film0_.rating AS rating5_8_,
    film0_.release_year AS release_6_8_,
    film0_.rental_duration AS rental_d7_8_,
    film0_.rental_rate AS rental_r8_8_,
    film0_.replacement_cost AS replacem9_8_,
    film0_.special_features AS special10_8_,
    film0_.title AS title11_8_
FROM
    dvdrental. PUBLIC .film film0_
INNER JOIN dvdrental.film_actor actors1_ ON film0_.film_id = actors1_.film_id
INNER JOIN dvdrental. PUBLIC .actor actor2_ ON actors1_.actor_id = actor2_.actor_id
INNER JOIN dvdrental.film_category categories3_ ON film0_.film_id = categories3_.film_id
INNER JOIN dvdrental. PUBLIC .category category4_ ON categories3_.category_id = category4_.category_id
WHERE
    category4_.category_id = 1
AND film0_.language_id = 1
AND film0_.release_year = 2016
AND actor2_.actor_id = 2;
生成的SQL

Query searchQuery = session.createQuery("select film from Film as film " +
                    "inner join film.actors  as a " +
                    "inner join film.categories as c " +
                    "where c.categoryId=:categoryId " +
                    "and film.language.id=:languageId " +
                    "and film.releaseYear=:releaseYear " +
                    "and a.actorId=:actorId");
SELECT
    film0_.film_id AS film_id1_8_,
    film0_.description AS descript2_8_,
    film0_.language_id AS languag12_8_,
    film0_.last_update AS last_upd3_8_,
    film0_. LENGTH AS length4_8_,
    film0_.rating AS rating5_8_,
    film0_.release_year AS release_6_8_,
    film0_.rental_duration AS rental_d7_8_,
    film0_.rental_rate AS rental_r8_8_,
    film0_.replacement_cost AS replacem9_8_,
    film0_.special_features AS special10_8_,
    film0_.title AS title11_8_
FROM
    dvdrental. PUBLIC .film film0_
INNER JOIN dvdrental.film_actor actors1_ ON film0_.film_id = actors1_.film_id
INNER JOIN dvdrental. PUBLIC .actor actor2_ ON actors1_.actor_id = actor2_.actor_id
INNER JOIN dvdrental.film_category categories3_ ON film0_.film_id = categories3_.film_id
INNER JOIN dvdrental. PUBLIC .category category4_ ON categories3_.category_id = category4_.category_id
WHERE
    category4_.category_id = 1
AND film0_.language_id = 1
AND film0_.release_year = 2016
AND actor2_.actor_id = 2;
此查询工作正常:

org.postgresql.util.PSQLException : ERROR : relation "dvdrental.film_actor" does NOT exist PreparedStatement.executeQuery () FAILED ! 
SELECT
    *
FROM
film f
INNER JOIN film_actor fa ON f.film_id = fa.film_id
LIMIT 100;
基于胶片实体注释的映射:

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "film_actor", catalog = "dvdrental", joinColumns = {
            @JoinColumn(name = "film_id", nullable = false, updatable = false) },
            inverseJoinColumns = { @JoinColumn(name = "actor_id",
                    nullable = false, updatable = false) })
    public Set<Actor> getActors() {
        return actors;
    }

    public void setActors(Set<Actor> actors) {
        this.actors = actors;
    }
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "film_actor", schema= "dvdrental", joinColumns = {
        @JoinColumn(name = "film_id", nullable = false, updatable = false) },
        inverseJoinColumns = { @JoinColumn(name = "actor_id",
                nullable = false, updatable = false) })
public Set<Actor> getActors() {
    return actors;
}

public void setActors(Set<Actor> actors) {
    this.actors = actors;
}
@ManyToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@JoinTable(name=“film\u actor”,catalog=“dvdreent”,JointColumns={
@JoinColumn(name=“film_id”,nullable=false,updateable=false)},
inverseJoinColumns={@JoinColumn(name=“actor\u id”,
nullable=false,updateable=false)})
公共集getActors(){
返回演员;
}
公共无效集合参与者(集合参与者){
这个。演员=演员;
}
解决方案/黑客:

org.postgresql.util.PSQLException : ERROR : relation "dvdrental.film_actor" does NOT exist PreparedStatement.executeQuery () FAILED ! 
SELECT
    *
FROM
film f
INNER JOIN film_actor fa ON f.film_id = fa.film_id
LIMIT 100;

注释
/*catalog=“dvdreent”*/
后,问题消失了。

您必须指定模式,而不是目录。

在生成的SQL查询中,您搜索表
dvdreart.PUBLIC.film
,我假设只有
dvdreart.film
存在

更新了基于胶片实体注释的映射:

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "film_actor", catalog = "dvdrental", joinColumns = {
            @JoinColumn(name = "film_id", nullable = false, updatable = false) },
            inverseJoinColumns = { @JoinColumn(name = "actor_id",
                    nullable = false, updatable = false) })
    public Set<Actor> getActors() {
        return actors;
    }

    public void setActors(Set<Actor> actors) {
        this.actors = actors;
    }
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "film_actor", schema= "dvdrental", joinColumns = {
        @JoinColumn(name = "film_id", nullable = false, updatable = false) },
        inverseJoinColumns = { @JoinColumn(name = "actor_id",
                nullable = false, updatable = false) })
public Set<Actor> getActors() {
    return actors;
}

public void setActors(Set<Actor> actors) {
    this.actors = actors;
}
@ManyToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@JoinTable(name=“film\u actor”,schema=“dvdreent”,JointColumns={
@JoinColumn(name=“film_id”,nullable=false,updateable=false)},
inverseJoinColumns={@JoinColumn(name=“actor\u id”,
nullable=false,updateable=false)})
公共集getActors(){
返回演员;
}
公共无效集合参与者(集合参与者){
这个。演员=演员;
}

catalog不是模式,它是上一层。看见