Загрузка DTO с коллекцией - PullRequest
       5

Загрузка DTO с коллекцией

0 голосов
/ 02 сентября 2018
@Entity
@Table(name = "person")
public class Consignment implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "person_id")
    private String personId;

    @Column(name = "person_name")
    private String personName;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "person")
    @Column(name = "cars_owned")
    private Set<Cars> casrsowned = new HashSet<>();
}
@Entity
@Table(name = "cars")
public class Cars implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

   @Column(name = "cars_id")
    private String carsId; 


  @ManyToOne
    @JoinColumn(name = "person")
    private Person person;

    @OneToOne
    private CarsDetail  carsDetail;
}
@Entity
@Table(name = "carsDetail")
public class CarsDetail implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "brand")
    private String brand;

    @Column(name = "color")
    private String color;

    @Column(name = "model")
    private String model;
}
class CarModelDTO {

    String personName;
    List<String> models;
}

В приведенном выше соотношении хотите вернуть CarModelDTO JPA запрос, где

@Query("Select CarModelDTO(p.personName, p.casrsowned.carsDetail.model) from Person as p where p`enter code here`.id = :id"))
public CarModelDTO getCarmodelOwnedByAperson(@Param("id") Long id);

Я пробовал несколько способов, но это дает org.hibernate.QueryException: illegal attempt to dereference collection

1 Ответ

0 голосов
/ 02 сентября 2018

Как я уже описал Извлечение списка из интерфейса репозитория в список DTO , вам необходимо выполнить следующий шаг:

  1. сначала создайте конструктор, используя поля, которые вы хотите вернуть из результатов запроса
  2. в вашем запросе вы должны создать новый экземпляр вашего dto и передать поле от db до новой установки:

так что вам нужны эти изменения:

1. В конструкторе:

Вы не должны использовать список как List<String> models;, так как вы должны учитывать, что ваш dto является строкой результата БД. поэтому вам нужно иметь простой String model;

    public CarModelDTO (String name,String model){    
        this.name=name;
        this.model=model;   
    }

2. В @Query:

  • вы должны использовать multi inner join соответствующим образом
  • вы также должны добавить имя вашего пакета в CarModelDTO в запросе (здесь я использовал com.example, вы должны изменить его)

        @Query("Select com.example.CarModelDTO(p.personName, d.model ) from Person as p inner join p.carsowned c inner join c.carDetail d where p`enter code here`.id = :id")) 
        public CarModelDTO getCarmodelOwnedByAperson(@Param("id") Long id)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...