Итак, есть похожий (почти идентичный) вопрос: Как выбрать только значение внешнего ключа с помощью 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")
он просто генерирует исключение, в котором говорится, что поле недоступно.
Как правильно этого избежать?
account_id
и объединить столбец с полем example. - person Eklavya   schedule 24.06.2020