Маппинг Many-to-Many в DTO с помощью Criteria в Hibernate

433
30 августа 2017, 14:35

У меня есть следующая проблема, и я даже не знаю решаема ли она в принципе. Есть ентити с отношением многие-ко-многим:

@Entity
@Table(name = "cars", schema = "", catalog = "relationship")
public class CarsEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false, insertable = true, updatable = true)
private int id;
@Column(name = "year", nullable = true, insertable = true, updatable = true)
private Integer year;
@Column(name = "model", nullable = true, insertable = true, updatable = true, length = 50)
private String model;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Fetch(FetchMode.SELECT)
@JoinTable(name = "employee_car",
    joinColumns = @JoinColumn(name = "car_id"),
    inverseJoinColumns = @JoinColumn(name = "employee_id"))
private Set<EmployeeEntity> employeeSet;
...

 @Entity
 @Table(name = "employee", schema = "", catalog = "relationship")
 public class EmployeeEntity {
 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 @Column(name = "id", nullable = false, insertable = true, updatable = true)
private int id;
@Column(name = "firstName", nullable = true, insertable = true, updatable = true, length = 200)
private String firstName;
@Column(name = "lastName", nullable = true, insertable = true, updatable = true, length = 200)
private String lastName;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Fetch(FetchMode.SELECT)
@JoinTable(name = "employee_car",
    joinColumns = @JoinColumn(name = "employee_id"),
    inverseJoinColumns = @JoinColumn(name = "car_id"))
private Set<CarsEntity> cars;
...

и есть DTO в который я бы хотел это смаппить:

public class EmployeeWithCarsDTO {
private int employeeId;
private String employeeName;
private String employeeLastName;
private Set<CarsEntity> cars;

Вот этот Criteria:

public List <EmployeeEntity> showEmployeesCars2 () {
  List<EmployeeEntity> list = null;
  Criteria crit = session.createCriteria(EmployeeEntity.class);
  list = crit.list();
  return list;
}

возвращает

 Employee{id=16, firstName='Vasya', lastName='Vasyatin', cars={CarsEntity{id=5, year=2005, model='vaz21099'}, CarsEntity{id=6, year=2015, model='calina'} }}
 Employee{id=17, firstName='Petya', lastName='Petrov', cars={CarsEntity{id=8, year=1989, model='Moskvich'}, CarsEntity{id=7, year=1991, model='Tavria'} }}
 Employee{id=18, firstName='Ivan', lastName='Ivanov', cars={CarsEntity{id=10, year=2015, model='Lanos'}, CarsEntity{id=9, year=1986, model='gaz66'}}}

И это то что мне нужно, но я хочу получить это в DTO. При этом Criteria

public List <EmployeeWithCarsDTO> showEmployeesCars () {
    List<EmployeeWithCarsDTO> list = null;
    Criteria crit = session.createCriteria(EmployeeEntity.class, "empl")
    .createAlias("empl.cars",  "cars")
   .setProjection(Projections.projectionList()
                .add(Projections.property("cars"), "cars")
                .add(Projections.property("empl.id"), "employeeId")
                .add(Projections.property("empl.firstName"), "employeeName")
                .add(Projections.property("empl.lastName"), "employeeLastName")
   ).setResultTransformer(Transformers.aliasToBean(EmployeeWithCarsDTO.class));
    list = crit.list();
    return list;
}

возвращает

EmployeeWithCarsDTO{employeeId=16, employeeName='Vasya', employeeLastName='Vasyatin', cars={}}
EmployeeWithCarsDTO{employeeId=16, employeeName='Vasya', employeeLastName='Vasyatin', cars={}}
EmployeeWithCarsDTO{employeeId=17, employeeName='Petya', employeeLastName='Petrov', cars={}}
EmployeeWithCarsDTO{employeeId=17, employeeName='Petya', employeeLastName='Petrov', cars={}}
EmployeeWithCarsDTO{employeeId=18, employeeName='Ivan', employeeLastName='Ivanov', cars={}}
EmployeeWithCarsDTO{employeeId=18, employeeName='Ivan', employeeLastName='Ivanov', cars={}}

Скажите, кто-нибудь, возможно ли вообще получить в DTO, то объекты с Set cars. Если да, то в каком направлении копать, а то я просто в тупике.

READ ALSO
Удаление символов

Удаление символов

Имеется следующий код:

318
Android - как сделать EditText неактивным, в то же самое время сохраняя курсор?

Android - как сделать EditText неактивным, в то же самое время сохраняя курсор?

Я разрабатываю клавиатуру используя EditText и Button-ыПри нажатии на кнопку, текстовое поле заполняется соответствующей буквой

330
Повтор обработки событий в Java

Повтор обработки событий в Java

Есть кнопка, при нажатии на которую проигрывается звук и меняется цветКак заставить через время возвращать кнопку первоначальный цвет и добавить...

398