为什么简单的select查询返回List 但是在jpa中连接查询返回List

我正在使用jpa的play框架。 我有一个带有2个函数的模型Jobads来查找all()findByLocation()

我的模特

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

找到所有()

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

findByLocation()

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

我在我的控制台中打印函数输出findall()工作正常但findByLocation()给我一个exception[ClassCastException:[Ljava.lang.Object; 不能施放给模特。小伙子们]

为什么只在findByLocation()中出现这个问题,这个问题的解决方案是什么?

谢谢

它正在发生,因为没有select子句的HQL查询是如何工作的。 请注意,这些不是有效的JPQL查询。 JPQL使select子句成为必需,并且使用select子句将允许您指定查询返回的内容:

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

考虑第二个查询返回的内容:由于join语句,您将拥有一个包含两行的表。 但是,我真的不知道在这种情况下输出的类型是什么,尝试使用它上面的getClass来查看。

createQuery()方法接受两个参数,查询和查询结果的类型,因此你可以这样写类型安全查询:

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