首页 > 解决方案 > “选择新构造函数”查询返回 java.lang.Object 而不是构造函数类的实例

问题描述

vartoShow是 pure 的实例,java.lang.Object如果我将它转换为 var ,它的唯一工作方式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;
}

我尝试过的:

我现在的工作代码是:

    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;
      }

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

标签: javahibernatejpajpqlentitymanager

解决方案


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

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

推荐阅读