Я использую метод CriteriaBuilder
.У меня есть несколько таблиц, связанных друг с другом.У меня есть 3 таблицы с именами A
, B
и C
.Предположим, что в таблице B
есть внешний ключ из таблицы *1005*, а в таблице C
есть еще один внешний ключ из таблицы B
.Итак, у меня есть запрос, подобный следующему:
CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
CriteriaQuery<ResultObject> query = criteriaBuilder.createQuery(ResultObject.class);
Root<A> rootA = query.from(A.class);
Join<A, B> joinB = root.join(A_.bId , JoinType.INNER);
Root<C> rootC = query.from(C.class);
query.where(criteriaBuilder.equal(joinB.get(B_.field) , rootC.get(C_.bId)));
Это выполняет работу, но создает запрос перекрестного соединения между B и C. Как я могу преобразовать его во внутреннее соединение?
Обновление:
вот мой hql, который работает нормально.Мне нужен эквивалент criteria builder
один:
select
new com.shaheri.financial.ReportParam(function('TRUNC',
contract.creationDate),
min(price.currencyCode),
count(price.id),
sum(price.totalPrice),
sum(price.userRound),
sum(price.userMarkup),
sum(price.userDiscount),
sum(price.userCommission),
sum(price.tax),
sum(price.surcharge),
sum(price.basePrice),
sum(price.agencyRound),
sum(price.agencyMarkup),
sum(price.agencyDiscount),
sum(price.agencyCommission))
from
Price as price
inner join
price.proforma as proforma
inner join
proforma.contract as contract
inner join
Voucher as voucher
on voucher.contract = contract
inner join
ServiceVoucher as serviceVoucher
on serviceVoucher.contract = contract
inner join
FlightVoucher as flightVoucher
on flightVoucher.contract = contract
where
(
contract.creationDate>=:param0
)
and (
contract.creationDate<=:param1
)
and (
price.originPrice is not null
)
and (
(
flightVoucher.agencySupplier in (
36L
)
)
or (
voucher.agencySupplier in (
36L
)
)
or (
serviceVoucher.agencySupplier in (
36L
)
)
)
and (
contract.user=4L
)
group by
function('TRUNC',
contract.creationDate)