Ошибка заполнения компонента — Querydsl

Я попытался заполнить List‹> запросом с помощью QueryDSL, но он выдает ошибку при заполнении bean-компонента.

Вот мой метод;

@Override
    public Page<UserDTO> findByTypeQuerydsl(String filters, Pageable pageable) {
        JPAQuery query = new JPAQuery(entityManager);
        query = (JPAQuery) super.getQuerydsl().applyPagination(pageable, query);

        List<UserDTO> results = query.from(qUserDTO)
                  .innerJoin(qUser)
                  .on(qUserDTO.id.eq(qUser.id))
                  .where(qUserDTO.login.eq(filters))
                  .list(Projections.fields(UserDTO.class, qUser.id, qUser.login, qUser.firstname, qUser.lastname, qUser.dayofbirth, 
                          qUserDTO.district, qUserDTO.city));


        return new PageImpl<UserDTO>(results, pageable, results.size());
    }

Ошибка выдается на .list и говорит;

Список методов (Projections.fields(UserDTO.class, qUser.id, qUser.login, qUser.firstname, qUser.lastname, qUser.dayofbirth, qUserDTO.district, qUserDTO.city)) не определен для типа QueryBase

Мой UserDTO.class;

@Entity
@Table(name="USERDTO")
@QueryEntity
public class UserDTO implements Serializable {

    private static final long serialVersionUID = -7860243025833384447L;

    @Id
    private Long id;
    private String login;
    private String firstname;
    private String lastname;
    private Date dayofbirth;
    private String city;
    private String district;
    @OneToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
    @JoinColumn(name="id")
    User user;

    //getters and setters

    }

Версии com-querydsl;

    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>4.1.3</version>
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>4.1.3</version>
    </dependency>

person N. Doye    schedule 03.04.2018    source источник


Ответы (2)


Если вы используете querydsl 4.x, вы должны использовать метод fetch() следующим образом:

QueryBase queryBase = new JPAQuery(qUserDTO)....
FetchableQueryBase fetchableQueryBase = (FetchableQueryBase) queryBase;
fetchableQueryBase.fetch();

Если вы действительно хотите сохранить свой синтаксис, вам следует перейти на версию 3.x.

здесь, примечания к выпуску.

person Andrea    schedule 03.04.2018
comment
Спасибо за сообщение, но когда я меняю list на .fetch(), выдает ошибку. Не могли бы вы показать мне, как точно преобразовать мой метод, хотя бы один раз? @Андреа - person N. Doye; 03.04.2018
comment
спасибо я справлюсь - person N. Doye; 03.04.2018

Я решил проблему, используя поток queryDSL 4 и Java 8:

List<UserDTO> results = new JPAQueryFactory(entityManager)
                .select(qUser.id, qUser.login, qUser.firstname, qUser.lastname, qUser.dayofbirth, qUserDTO.district, qUserDTO.city)
                .from(qUserDTO)
                .innerJoin(qUserDTO.user(), qUser)
                .where(qUserDTO.login.like(filters))
                .fetch()
                .stream()
                .map(c -> new UserDTO(c.get(qUser.id), c.get(qUser.login), c.get(qUser.firstname), c.get(qUser.lastname), 
                        c.get(qUser.dayofbirth), c.get(qUserDTO.district), c.get(qUserDTO.city)))
                .collect(Collectors.toList());
person N. Doye    schedule 03.04.2018