Соедините 2 таблицы, используя Спецификацию критериев Spring Boot JPA и Предикат - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь создать критерий для получения строк из 2 таблиц (UserDetail, Vehicle).UserDetail имеет ссылку на автомобиль.Моя цель - получить список указанных полей из обеих таблиц с помощью идентификатора UserDetail.В @Query это было легко сделать, но клиент сказал, что это должно быть закодировано с критериями со спецификацией и предикатом объединения таблиц.

Мой @Query был:

@Repository
public interface UserDao extends CrudRepository<UserDetail, Integer>{

    @Query("SELECT ud.userId, ud.userName ,vh.vehicleId, vh.vehicleName "
            + "FROM UserDetail ud LEFT JOIN ud.vehicle vh where ud.vehicleId = vh.vehicleId")
    public List<UserVehicleDTO> findAllUserVehicle();

}

Может кто-нибудь помочь мне?Я получаю данные, используя спецификацию с предикатом, поскольку данный запрос необходим

1 Ответ

0 голосов
/ 09 апреля 2019

Критерий запроса (я не проверял / не отлаживал его, возможно, потребуется изменить):

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Tuple> query = cb.createTupleQuery();
    Root<UserDetail> root = query.from(UserDetail.class);

    Join<UserDetail, Vehicle> join = root.join("vehicle", JoinType.LEFT);
    query.multiselect(     
                    root.get("userId"),
                    root.get("userName"),
                    join.get("vehicleId"),
                    join.get("vehicleName")
            )) 
    List<Tuple> x = entityManager.createQuery(query).getResultList();

КСТАТИ. JPQL-запрос неверен. Не нужно где условие, оно будет создано JPA автоматически.

SELECT ud.userId, ud.userName ,vh.vehicleId, vh.vehicleName 
FROM UserDetail ud 
LEFT JOIN ud.vehicle
...