2016-11-05 71 views
0

user_vehicle是我的非持久DTO类,我试图使用hibernate SQLQuery获取同一类的一组记录。用于获取记录hibernate.PropertyNotFoundException:无法找到具有多级映射的setter Transformer

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

我得到错误的 异常线程 “main” org.hibernate.PropertyNotFoundException

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 
} 

代码:找不到制定者vehicle.vehicleName阶级user_vehicle

user_details and vehicle表没有任何关系。

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 
} 
+0

我不想复制所有车辆类别属性user_vehicle和b.vehiclename改变我的SQL作为\“车辆.vehicleName \“以b.vehicleName作为vehicleName。 –

+0

我没有得到你 – developer

回答

0

由于异常不能找到设置为vehicle.vehicleName 明确说,你丢失setVechicleName()私人的方法String vehicleName,确保你已经创建它。由于Hibernate将一个Java对象与一个关系表相关联,它使用这些设置器方法在从数据库中获取数据时填充数据。

setVechicleName(String vehicleName) { 

    this.vehicleName = vehicleName; 

} 
+0

是的,我在车辆类中有相同的setter方法。 –

+0

你可以添加完整的实体类吗? – developer

0

如果你想改变一个实体多层次DTO类,我想你应该看这个问题:Populate child bean with Transformers.aliasToBean in Hibernate。它指的是Hibernate Transformers.aliasToBean()的局限性,并提供了一个自定义解决方案来绕过它。

另一解决方案是内联Vehicle DTO在user_vehicle DTO(更常规的类名,没有下划线并用驼峰会更标):

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

要做到这一点,我需要在user_vehicle类中添加myVehicleName属性。如果车辆有很多属性,并且我想在查询中选择所有属性,那么我也需要将所有车辆属性添加到user_vehicle类。 –

+0

在这种情况下,它会更复杂。我刚刚编辑过。 – davidxxx

相关问题