我正在使用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> 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;无法投射到模特。小伙子们]
为什么只在findByLocation()中出现此问题以及此问题的解决方案是什么?
由于
答案 0 :(得分:2)
这种情况正在发生,因为没有select子句的HQL查询是如何工作的。请注意,这些不是有效的JPQL查询。 JPQL使select子句成为必需,并且使用select子句将允许您指定要返回查询的内容:
select j from Jobads j join j.city c WHERE c.name LIKE :location
答案 1 :(得分:1)
考虑第二个查询返回的内容:由于join
语句,您将拥有一个包含两行的表。但是,在这种情况下,我真的不知道输出的类型是什么,请尝试使用getClass
来查看。
答案 2 :(得分:1)
createQuery()
方法接受两个参数,查询和查询结果的类型,因此您可以这样写类型安全查询:
createQuery("FROM Jobads j join j.city c WHERE c.name LIKE :location", Jobads.class);