![](/img/trans.png)
[英]HIbernate Mapping Exception: PropertyNotFoundException: Could not find a setter
[英]hibernate.PropertyNotFoundException: Could not find setter with multi-level mapping Transformer
user_vehicle是我的非持久性DTO类,我正尝试使用休眠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()));
我在线程“主要” org.hibernate.PropertyNotFoundException中得到异常错误:在类user_vehicle上找不到vehicle.vehicleName的设置器 。
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
}
正如“ 找不到为 setVechicleName()
设置器”的明确说明一样,您缺少私有String vehicleName
setVechicleName()
方法,请确保已创建它。
当Hibernate将Java对象与Relational表关联时,它使用这些setter方法在从数据库中获取数据时填充数据。
setVechicleName(String vehicleName) {
this.vehicleName = vehicleName;
}
如果要将实体转换为多级dto类,我认为您应该阅读以下问题: 在Hibernate中使用Transformers.aliasToBean填充子bean 。 它引用了Hibernate Transformers.aliasToBean()
限制,并提供了一个自定义解决方案来绕过它。
另一个解决方案是在user_vehicle
dto中内嵌Vehicle
dto(更常规的类名,不带下划线,带有驼峰的情况会更标准):
public class user_vehicle {
private Integer userid;
private String username;
private Integer userYear;
private Integer vehicleId;
private String vehicleName;
private Integer vehicleYear;
}
当然,另一个解决方案是使用继承。
从语义userVehicle
,如果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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.