2016-11-05 74 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

相關問題