Spring: невозможно запросить хранилище с выбранными полями - PullRequest
0 голосов
/ 19 сентября 2019

Прежде чем я объясню свою проблему, я хотел бы упомянуть, что ни один из ответов, связанных с этой проблемой, не работал для меня.Это может быть связано либо с тем, что фактический вопрос не был найден в поиске stackoverflow, либо просто ответы не совсем относятся к моей проблеме.

Итак, я ищу, чтобы выбрать количество полей Xкогда я делаю findAll, и я хочу сделать это, потому что сущность, к которой подключен репозиторий, имеет столбец соединения и по умолчанию JPA запрашивает связанные данные из другой таблицы, поэтому я хочу получить результат моегозапрос должен быть компактным быстроseasons записей.Таким образом, при выполнении запроса findAll для seasons вы можете ожидать, что JPA также запросит series и вставит свои данные в качестве подобъекта в seasons в качестве результата.

seasons сущность выглядит следующим образом:

package com.vod.cloudservice.entity;

import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.Date;

@Entity
@Table(name = "seasons")
public class Season {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @NotNull
    @ManyToOne
    @JoinColumn(name = "series_id")
    private Series series;

    @CreationTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "create_time")
    private Date createTime;

    @UpdateTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "update_time")
    private Date updateTime;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "delete_time")
    private Date deleteTime;

    public Season() {
    }

    public Season(@NotNull String name, @NotNull Series series) {
        this.name = name;
        this.series = series;
    }

    /* Getters and Setters here */
}

И seasons хранилище выглядит следующим образом:

package com.vod.cloudservice.repository;

import com.vod.cloudservice.entity.Season;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface SeasonRepository extends CrudRepository<Season, Long> {
    @Query("SELECT id, name FROM Season")
    List<Season> findAllSeasons();
}

Как видите, я хочу выбрать только id и name хотя бы пока.И когда я выполняю этот метод, Spring выдает эту ошибку:

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.Long] to type [@org.springframework.data.jpa.repository.Query com.vod.cloudservice.entity.Season]

Я пытался изменить тип запроса, чтобы быть нативным, и адаптировать фактический запрос, чтобы быть запросом SQL, но это все ещевыдает ту же ошибку, поэтому я не знаю, что делать в этом случае.

Примечание : я все еще учусь, как Spring и JPAс Hibernate работает, поэтому я был бы очень признателен, если бы ответ мог дать объяснение того, почему предлагаемый ответ работает таким образом.

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Согласно документации , вы можете создать проекцию:

public interface SeasonIdName {

    String getId();
    String getName();

}

и затем использовать ее в хранилище следующим образом:

public interface SeasonRepository extends CrudRepository<Season, Long> {

    @Query("SELECT id, name FROM Season")
    List<SeasonIdName> findAllSeasons();

}
0 голосов
/ 20 сентября 2019

Используя JdbcTemplate, не нужно создавать интерфейс:

public class SeasonIdNameDto {

    private String getId();
    private String getName();

    //getter and setters

}

Затем используйте его в репозитории как:

public interface SeasonRepository extends JpaRepository<Season, Long> {

    @Inject
    private DataSource myDataSource;

    List<SeasonIdNameDto> getSeasons(){
    NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate( myDataSource);
    List<SeasonIdNameDto> listOfSeason=jdbcTemplate.query("SELECT id, name FROM Season",new BeanPropertyRowMapper<SeasonIdNameDto>(SeasonIdNameDto.class) );
    return listOfSeason
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...