ПРАВИЛЬНОЕ СОЕДИНЕНИЕ в JPQL - PullRequest
8 голосов
/ 27 августа 2011

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

@Entity
class UserClient{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
}

@Entity
class UserAccess{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @ManyToOne(optional = false, cascade = { CascadeType.REFRESH })
    private UserClient user;

    @Temporal(TemporalType.TIMESTAMP)
    private Date accessTs;
}

Теперь я хотел выполнить запрос JPQL, чтобы получить список пользователей с их последней датой доступа.К сожалению, следующий запрос не возвращает пользователей, которые никогда не обращались к системе, то есть существуют в таблице UserClient, но не имеют ни одной записи в таблице UserAccess.

SELECT ua.user, MAX(ua.accessTs) FROM UserAccess ua RIGHT JOIN ua.user

Я что-то пропустил?Это правильное использование RIGHT JOIN?

Я использую последнюю версию Hibernate JPA (4.0.0.CR1)

1 Ответ

6 голосов
/ 27 августа 2011

Вы должны сделать таблицу UserClient стороной владельца (что более логично для ИМО).Тогда вы можете использовать LEFT JOIN вместо RIGHT JOIN.

SELECT uc, MAX(ua.accessTs) FROM UserClient uc LEFT JOIN uc.userAccess ua

Вот почему левое соединение на UserAccess работает :

SQL left join visual description

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