JPA: выберите запрос выборки как родительский, так и дочерний - PullRequest
1 голос
/ 02 февраля 2012

Я использую JPA с реализацией Eclipse Link.

У меня есть следующее отношение между UserAccount и UserDetail:

Аккаунт пользователя:

@OneToOne(fetch=FetchType.EAGER)
@PrimaryKeyJoinColumn
private UserDetail userDetail;

Данные пользователя:

@OneToOne(mappedBy="userDetail")
private UserAccount userAccount;

Я пытаюсь получить одну учетную запись пользователя из БД:

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<UserAccount> shell = builder.createQuery(UserAccount.class);

Root<UserAccount> entity = shell.from(UserAccount.class);
shell.select(entity);
shell.distinct(true);

List<Predicate> predicateList = new ArrayList<Predicate>();
if (id != null){
    ParameterExpression<Integer> param = builder.parameter(Integer.class, "id");
    predicateList.add(builder.equal(entity.get("id"), param));
}

if (predicateList.size() == 1){
    shell.where(predicateList.get(0));
} else {
    Predicate[] p = new Predicate[predicateList.size()];
    p = predicateList.toArray(p);
    shell.where(builder.and(p));
}   

TypedQuery<UserAccount> selectQuery =  em.createQuery(shell);
if (id != null) selectQuery.setParameter("id", id);
return selectQuery.getResultList();

Этот запрос выполняет поиск пользователей по идентификатору. Проблема в том, что в результате UserAccount не имеет сущности UserDetail, хотя я использовал (fetch=FetchType.EAGER). Чего мне не хватает?

1 Ответ

0 голосов
/ 02 февраля 2012

Вы не определили, на каком столбце в базе данных JPA должна базироваться для выполнения операции соединения.

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