为什么简单 select 查询 returns List<Mymodel> 但在 jpa 中加入查询 return List<Object>
why simple select query returns List<Mymodel> but join query return List<Object> in jpa
我正在使用带有 jpa 的播放框架。我有一个带有 2 个函数的模型 Jobads 到 findall() 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;无法转换为 models.Jobads]
为什么这个问题只发生在 findByLocation() 中,这个问题的解决方案是什么??
谢谢
它正在发生,因为这就是没有 select 子句的 HQL 查询的工作方式。请注意,这些不是有效的 JPQL 查询。 JPQL 使 select 子句成为强制性的,使用 select 子句将允许您指定要查询的内容 return:
select j from Jobads j join j.city c WHERE c.name LIKE :location
考虑一下您的第二个查询返回的内容:由于 join
语句,您将有一个包含两行的 table。但是,我真的不知道在这种情况下输出的类型是什么,尝试使用 getClass
看看。
createQuery()
方法接受两个参数,query和查询结果的类型,因此可以这样写类型安全的query:
createQuery("FROM Jobads j join j.city c WHERE c.name LIKE :location", Jobads.class);
我正在使用带有 jpa 的播放框架。我有一个带有 2 个函数的模型 Jobads 到 findall() 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;无法转换为 models.Jobads]
为什么这个问题只发生在 findByLocation() 中,这个问题的解决方案是什么??
谢谢
它正在发生,因为这就是没有 select 子句的 HQL 查询的工作方式。请注意,这些不是有效的 JPQL 查询。 JPQL 使 select 子句成为强制性的,使用 select 子句将允许您指定要查询的内容 return:
select j from Jobads j join j.city c WHERE c.name LIKE :location
考虑一下您的第二个查询返回的内容:由于 join
语句,您将有一个包含两行的 table。但是,我真的不知道在这种情况下输出的类型是什么,尝试使用 getClass
看看。
createQuery()
方法接受两个参数,query和查询结果的类型,因此可以这样写类型安全的query:
createQuery("FROM Jobads j join j.city c WHERE c.name LIKE :location", Jobads.class);