2016-11-27 3 views
1

По какой-то странной причине спящий сгенерированный запрос не работает с postgres, он говорит, что он не может найти отношение/таблицу, хотя есть действительная таблица film_actor в dvdrental схема? Это answer не помогло.org.postgresql.util.PSQLException: ERROR: отношение НЕ существует PreparedStatement.executeQuery()

Исключение:

org.postgresql.util.PSQLException : ERROR : relation "dvdrental.film_actor" does NOT exist PreparedStatement.executeQuery() FAILED ! 

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"); 

генерируемый SQL

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; 

Этот запрос работает отлично:

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; 
    } 

Решение/Hack:

После комментирования /*catalog = "dvdrental"*/ проблема ушла.

+1

Каталог не схема, это следующий уровень вверх. См. [В чем разница между каталогом и схемой в реляционной базе данных?] (Http://stackoverflow.com/questions/7022755/whats-the-difference-between-a-catalog-and-a-schema-in- а-реляционные базы данных) – teppic

ответ

0

Вы должны указать схему, а не каталог. Link

В сгенерированного SQL-запроса вы искать таблицу dvdrental.PUBLIC.film, и я полагаю, что только dvdrental.film существует.

Обновленный фильм сущность аннотацию на основе отображения:

@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; 
}