【问题标题】:why simple select query returns List<Mymodel> but join query return List<Object> in jpa为什么简单的选择查询返回 List<Mymodel> 但在 jpa 中加入查询返回 List<Object>
【发布时间】:2015-01-03 08:06:58
【问题描述】:

我正在使用带有 jpa 的播放框架。我有一个模型 Jobads 有 2 个函数来 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;无法转换为模型。Jobads]

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    发生这种情况是因为这就是没有选择子句的 HQL 查询的工作方式。请注意,这些不是有效的 JPQL 查询。 JPQL 强制使用 select 子句,使用 select 子句可以让您指定您希望查询返回的内容:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-18
          • 1970-01-01
          • 2011-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多