为什么简单的select查询返回List <mymodel>但是连接查询返回List <object> in jpa </object> </mymodel>

时间:2015-01-03 08:06:58

标签: java exception jpa model-view-controller playframework

我正在使用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()中出现此问题以及此问题的解决方案是什么?

由于

3 个答案:

答案 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);