0

user_vehicle is my non-persistent DTO class and i am trying to fetch a set of records of the same class using hibernate SQLQuery .

 public class user_vehicle {
        private Integer userid;
        private String username;
        private Integer userYear;
  //here is the problem
        private Vehicle vehicle;
    //getter and setter
    }

public class Vehicle {
    private Integer vehicleId;
    private String vehicleName;
    private Integer vehicleYear;
//getter setter
}

code for fetching the records

String sql = "select a.user_name as username ,b.vehiclename as \"vehicle.vehicleName\"  "
                + "from user_details a inner join vehicle b on a.user_year = b.vehicleyear;";
SQLQuery query = session.createSQLQuery(sql);
query.addScalar("username",StringType.INSTANCE);
query.addScalar("vehicle.vehicleName",StringType.INSTANCE);
query.setResultTransformer(Transformers.aliasToBean(user_vehicle.class));
List<user_vehicle> list = query.list();
list.forEach(t->System.out.println(t.getUsername()+"  --  "+t.getVehicle()));

I am getting error as Exception in thread "main" org.hibernate.PropertyNotFoundException: Could not find setter for vehicle.vehicleName on class user_vehicle.

user_details and vehicle table doesn't have any relation.

enter image description here

enter image description here

i am doing this, so that i can access vehicleName as

list.forEach(t->System.out.println(t.getVehicle().getVehicleName()));

Here are my user_details entity class

  @Entity(name = "User_Details")
 public class User {
 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 @Column(name="user_id")
 private Integer userid;
 @Column(name="user_name")
 private String username;
 @Column(name="user_year")
 private Integer userYear;
 //getter and setter
}
 @Entity
 @Table(name = "Vehicle", catalog = "public", schema = "")
 public class VehicleDetails {
 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Integer vehicleId;
 @Column
 private String vehicleName;
 @Column
 private Integer vehicleYear;
 //getter and setter
}
davidxxx
  • 125,838
  • 23
  • 214
  • 215
Santanu Sahoo
  • 1,137
  • 11
  • 29

2 Answers2

0

As the exception Could not find setter for vehicle.vehicleName clearly says, you are missing setVechicleName() method for private String vehicleName, ensure that you have created it.

As Hibernate relates a Java Object to a Relational table, it uses these setter methods to populate the data while fetching from database.

setVechicleName(String vehicleName) {

  this.vehicleName = vehicleName;

}
Vasu
  • 21,832
  • 11
  • 51
  • 67
0

If you want to transform an entity to multi-level dto class, I think you should read that question : Populate child bean with Transformers.aliasToBean in Hibernate. It refers to Hibernate Transformers.aliasToBean() limitations and provides a custom solution to bypass it.

Another solution would be to inline Vehicle dto in user_vehicle dto (a more conventional class name without underscore and with camelcase would be more standard) :

public class user_vehicle {
    private Integer userid;
    private String username;
    private Integer userYear;

   private Integer vehicleId;
   private String vehicleName;
   private Integer vehicleYear;
}


Again another solution would be to use inheritancy if relevant of course.
Semantically, if a userVehicle is a vehicle, it may be a suitable bypassing solution :

public class user_vehicle extends Vehicle{
        private Integer userid;
        private String username;
        private Integer userYear;
}

public class Vehicle {
    private Integer vehicleId;
    private String vehicleName;
    private Integer vehicleYear;
}
Community
  • 1
  • 1
davidxxx
  • 125,838
  • 23
  • 214
  • 215
  • to do this i need to add myVehicleName property in user_vehicle class.what if the vehicle have many properties and i want to select all in the query, in that case too i need to add all vehicle properties to user_vehicle class. – Santanu Sahoo Nov 05 '16 at 11:59
  • In this case, it will be more complicate. I have just edited. – davidxxx Nov 05 '16 at 12:41