使用Spring Boot JPA Criteria Specification and Predicate加入2个表

问题描述 投票:0回答:1

我正在尝试创建一个标准来从2个表(UserDetail,Vehicle)中检索行。 UserDetail引用了Vehicle。我的目标是在给定UserDetail id的情况下从两个Tables中检索指定字段的列表。在@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();

}

谁能帮我?我使用带有谓词的规范获取数据,因为需要查询

spring-boot jpa criteria predicate specification-pattern
1个回答
0
投票

Criteria查询(我没有测试/调试它,可能需要修改):

    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();

BTW。 JPQL查询错误。不需要条件,它将由JPA自动创建。

SELECT ud.userId, ud.userName ,vh.vehicleId, vh.vehicleName 
FROM UserDetail ud 
LEFT JOIN ud.vehicle
© www.soinside.com 2019 - 2024. All rights reserved.