【问题标题】:"select new constructor" query returns java.lang.Object instead of instance of constructors class“选择新构造函数”查询返回 java.lang.Object 而不是构造函数类的实例
【发布时间】:2021-05-17 11:08:38
【问题描述】:

var toShow 是纯java.lang.Object 的实例,如果我将其转换为FactionProjection,它的唯一工作方式,我认为这不是正确的方式。我的方法:

    public FactionProjection getFactionById(int id){
    Query query = entityManager.createQuery(
        "SELECT new com.gamerecords.result_recorder.model.projection.FactionProjection(f.name)" +
        "FROM Faction f WHERE f.id = :id",FactionProjection.class)
        .setParameter("id",id);
    var toShow =  query.getSingleResult();
    return toShow;

}

构造函数:

    public FactionProjection(String name) {
    this.name = name;
}

我尝试过的:

  • .createQuery 的第二个参数更改为Faction.class,或 删除它
  • 将方法.getSingleResult()更改为.getResultList()

我现在的工作代码是:

    public FactionProjection getFactionById(int id){
        Query query = entityManager.createQuery(
            "SELECT new com.gamerecords.result_recorder.model.projection.FactionProjection(f.name)" +
                " FROM Faction f WHERE f.id = :id",FactionProjection.class)
            .setParameter("id",id);
        var toShow =  (FactionProjection)query.getSingleResult();
        return toShow;
      }

我看过很多“选择新构造函数”表达式的例子,并且不需要强制转换,这让我觉得我在这里犯了一个错误。

【问题讨论】:

    标签: java hibernate jpa jpql entitymanager


    【解决方案1】:

    普通查询 API 不会返回您期望的确切类型的 Object,您需要进行转换。 Query#getSingleResult() 返回一个 Object。您可以改用TypedQuery<T>

    TypedQuery<FactionProjection> query;
    var result= query.getSingleResult();
    

    【讨论】:

      猜你喜欢
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 2011-04-19
      • 1970-01-01
      相关资源
      最近更新 更多