hibernate.PropertyNotFoundException:找不到具有多级映射Transformer的setter

时间:2016-11-05 11:24:43

标签: java postgresql hibernate

user_vehicle是我的非持久性DTO类,我正在尝试使用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
}

获取记录的代码

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()));

我收到错误了 线程中的异常&#34; main&#34; org.hibernate.PropertyNotFoundException:无法在类user_vehicle 上找到vehicle.vehicleName的setter。

user_details 车辆表没有任何关系。

enter image description here

enter image description here

我这样做,所以我可以访问vehicleName为

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

这是我的user_details实体类

  @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
}

2 个答案:

答案 0 :(得分:0)

作为例外无法找到vehicle.vehicleName 的setter   清楚地说,您缺少私人setVechicleName()的{​​{1}}方法,请确保您已创建它。

由于Hibernate将Java对象与Relational表相关联,因此它使用这些setter方法在从数据库中提取时填充数据。

String vehicleName

答案 1 :(得分:0)

如果您想将实体转换为多级dto类,我认为您应该阅读该问题:Populate child bean with Transformers.aliasToBean in Hibernate。它引用了Hibernate Transformers.aliasToBean()限制,并提供了绕过它的自定义解决方案。

另一个解决方案是在Vehicle dto中内联user_vehicle dto(没有下划线的更传统的类名,并且使用camelcase会更加标准化):

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

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


如果相关的话,另一种解决方案是使用继承性 从语义上讲,如果userVehiclevehicle,它可能是一个合适的绕过解决方案:

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;
}