2015-01-03 24 views
3

我正在使用與jpa播放框架。我有2個功能模型Jobads到的findAll()findByLocation()爲什麼簡單選擇查詢返回列表<Mymodel>但加入查詢返回列表<Object> jpa

我的模型

public class Jobads { 

     @Id 
     @Column(name = "id", nullable = false) 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     private Long id; 


     private String title; 

     @ManyToOne 
     private Jobindistry industry; 


     @ManyToMany 
     @JoinTable(
       name = "jobads_city", 
       joinColumns = {@JoinColumn(name = "jobads_id", referencedColumnName = "id")}, 
       inverseJoinColumns = {@JoinColumn(name = "city_id", referencedColumnName = "id")}) 
     private List<City> city; 
    } 

的findAll()

public static List<Jobads> findall() { 
      @SuppressWarnings("unchecked") 
      List<Jobads> el = JPA.em().createQuery("from Jobads order by id").getResultList(); 
      return el; 
     } 

findByLocation()

public static List<Jobads> findByLocation(String location) { 
    List<Jobads> jadList = JPA.em().createQuery("FROM Jobads j join j.city c WHERE c.name LIKE :location ").setParameter("location", "%" + location + "%").getResultList(); 

return jadList; 

} 

我打印在我的控制檯中的函數輸出findall()工作正常,但findByLocation()給我一個例外[ClassCastException:[Ljava.lang.Object;無法投射到models.Jobads]

爲什麼只發生在findByLocation()中的這個問題以及這個問題的解決方案是什麼?

謝謝

回答

2

這是因爲這是如何沒有選擇條款的HQL查詢工作。請注意,這些不是有效的JPQL查詢。 JPQL使得SELECT子句強制,並使用SELECT子句允許您指定要查詢返回的內容:

select j from Jobads j join j.city c WHERE c.name LIKE :location 
+0

thaku非常非常 – silentprogrammer

1

想想什麼是你的第二個查詢返回的:你將有兩行的表由於join聲明。但是,我不知道這種情況下輸出的類型是什麼,請嘗試使用getClass來查看。

1

createQuery()方法接受兩個參數,查詢和查詢結果的類型,因此你可以寫類型安全的查詢是這樣的:

createQuery("FROM Jobads j join j.city c WHERE c.name LIKE :location", Jobads.class);