Ошибка SQL при выполнении запроса JPQL с использованием оператора IN - PullRequest
2 голосов
/ 15 марта 2011

У меня есть следующие 2 класса JPA:


@Entity
public class AnalysisPolicy {
    private Set rules;
    //stuff omitted
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    public Set getRules() {
        return rules;
    }
}

@Entity
public class AnalysisRule {
    //stuff omitted
}

и следующий запрос JPQL: select p from AnalysisPolicy p, AnalysisRule r where r.id=:ruleId and r in p.rules, который принимает один параметр, ruleId, типа java.util.UUID (это класс, который я использую)как @Id для всех моих сущностей).пытаясь выполнить запрос, я получаю следующие результаты:

Hibernate: 
    /* select
        p 
    from
        AnalysisPolicy p,
        AnalysisRule r 
    where
        r.id=:ruleId 
        and r in p.rules */ select
            analysispo0_.f_id as f1_12_,
            analysispo0_.f_lastmodified as f2_12_,
            analysispo0_.global as global12_ 
        from
            AnalysisPolicy analysispo0_ cross 
        join
            AnalysisRule analysisru1_ cross 
        join
            AnalysisPolicy_AnalysisRule rules2_, AnalysisRule analysisru3_ 
        where
            analysispo0_.f_id=rules2_.AnalysisPolicy_f_id 
            and rules2_.rules_f_id=analysisru3_.f_id 
            and analysisru1_.f_id=? 
            and (
                analysisru1_.f_id in (
                    .
                )
            ) limit ?
[org.hibernate.util.JDBCExceptionReporter] SQL Error: 0, SQLState: 42601
[org.hibernate.util.JDBCExceptionReporter] ERROR: syntax error at or near "."

, что означает, что мой JPQL принят hibernate, но по какой-то причине выдаваемый им SQL-код недействителен ("analysisru1_.f_id in (.)"часть).

я использую hibernate 3.6 и postgresql 9 для БД.что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 15 марта 2011

Запрос неправильный, IN не может быть использован таким образом.Вы должны написать

select p from AnalysisPolicy p, AnalysisRule r 
    where r.id=:ruleId and r in elements(p.rules)

или

select p from AnalysisPolicy p, AnalysisRule r 
    where r.id=:ruleId and r member of p.rules

Но следующий запрос, возможно, будет лучшим из всех:

select p from AnalysisPolicy p join p.rules r where r.id=:ruleId
1 голос
/ 15 марта 2011

Ваш HQL выглядит сбивающим с толку меня. Я думаю, что вы могли бы переписать это так:

select r.p from AnalysisRule r where r.id=:ruleId

Возвращает все политики, которые содержат данное правило. Вы можете даже поместить отличное там: -)

Edit: axtavt был быстрее и дал лучший ответ, чем я. Также кажется, что мы получили аналогичную идею о переписывании HQL-запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...