Hibernate - как выбрать только значение внешнего ключа с помощью Criteria Query без выполнения соединения?

Итак, есть похожий (почти идентичный) вопрос: Как выбрать только значение внешнего ключа с помощью Criteria Query?, но мне нужно избегать объединения.

Итак, у меня есть две таблицы, одна с FK для другой.

(Услуга)

  • id
  • имя
  • account_id

(Счет)

  • id
  • имя

Класс обслуживания имеет FK, определенный следующим образом:

@Entity
public class Service extends BaseDbEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    private Account account;

...

и что я хочу сделать, так это запросить все службы, соответствующие данной учетной записи, имеющие accountId, без выполнения JOIN, потому что идентификатор уже находится в таблице Service.

Теперь мой запрос критериев выглядит так:

CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Service> criteria = cb.createQuery(Service.class);
Root<Service> root = criteria.from(Service.class);
criteria
        .select(root)
        .where(cb.equal(root.join("account").get("id"), accountId));
session.createQuery(criteria).getResultStream();

Это приводит к генерации этого запроса:

Hibernate: select service0_.id as id1_3_, service0_.name as name4_3_, service0_.account_id as account_id6_3_ from Service service0_ inner join Account account1_ on service0_.account_id=account1_.id where account1_.id=?

Что не имеет смысла ... он выполняет соединение в поле, а затем просто создает предложение where для этого поля.

If I do:

root.get("account_id")

он просто генерирует исключение, в котором говорится, что поле недоступно.

Как правильно этого избежать?


person Pablo Matias Gomez    schedule 24.06.2020    source источник
comment
Затем вам нужно добавить поле в объект для account_id и объединить столбец с полем example.   -  person Eklavya    schedule 24.06.2020


Ответы (1)


Хорошо, я только что нашел ответ на свой вопрос:

Мне просто нужно было сделать:

root.get("account").get("id")
person Pablo Matias Gomez    schedule 24.06.2020
comment
Вы проверили запрос, к которому он не присоединяется? - person Eklavya; 24.06.2020
comment
Да, теперь в журнале запросов написано следующее: Hibernate: select service0_.id as id1_3_, service0_.name as name4_3_, service0_.owner_id as owner_id6_3_, from Service service0_ where service0_.owner_id=? - person Pablo Matias Gomez; 24.06.2020
comment
owner_id означает account_id верно? Хорошо знать :) - person Eklavya; 24.06.2020
comment
Да, извините, я вносил некоторые изменения, это account_id - person Pablo Matias Gomez; 24.06.2020