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 和车辆表没有任何关系。
我这样做,所以我可以访问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
}
答案 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;
}
如果相关的话,另一种解决方案是使用继承性
从语义上讲,如果userVehicle
是vehicle
,它可能是一个合适的绕过解决方案:
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;
}