JPA 本机查询结果集映射到具有子类的实体类

Posted

技术标签:

【中文标题】JPA 本机查询结果集映射到具有子类的实体类【英文标题】:JPA Native Query Result Set Mapping to Entity class having child class 【发布时间】:2019-05-16 16:24:35 【问题描述】:

(发布问题后列和变量名更改)当我运行代码时,我正在使用 jpa 自定义方法中的 entityManager.createNativeQuery(somequery) 编写连接查询,但出现以下错误:

com.ibm.db2.jcc.am.SqlException:[jcc][10150][10300][4.12.56] 无效>参数:未知列名 exc_seq_nbr。 ERRORCODE=-4460,SQLSTATE=null

我正在使用 IBM DB2 服务器和 Spring Boot

exceptionTenderPK(实体类中的对象)未正确映射,这就是为什么获取无效列的原因有人可以告诉我如何映射 exceptionTenderPK 对象类

注意:在这种情况下我不能使用@OneToMany,因为表是不相关的

@Entity
@Table(name = "Table_name")


@Data
public class MainPojoclass 
    
    @EmbeddedId
    @JsonProperty(value = "mainPojoclassPK")
    private MainPojoclassPK mainPojoclassPK;
    

    @Column(name = "amt")
    @JsonProperty(value = "amt")
    private BigDecimal amt;
    
    @Column(name = "tndid")
    @JsonProperty(value = "tndid")
    private String tndid;
    
    @Column(name = "cde")
    @JsonProperty(value = "cde")
    private String cde;
    
    @Column(name = "ind")
    @JsonProperty(value = "ind")
    private String ind;
    
    @Column(name = "user")
    @JsonProperty(value = "user")
    private String user;
    
    @Column(name = "updatedtime")
    @JsonProperty(value = "updatedtime")
    private Date updatedtime;
    
    @Column(name = "src")
    @JsonProperty(value = "src")
    private String src;
    
    @Column(name = "stat")
    @JsonProperty(value = "stat")
    private String stat;
    




@Transactional
public interface JoinQueryRepository extends JpaRepository<MainPojoclass, Long>, JoinQueryRepositoryCustom
    


public interface JoinQueryRepositoryCustom 
    
    List<MainPojoclass> getGRDetails(MainPojoclass et,Date reportDate);



public class JoinQueryRepositoryImpl implements JoinQueryRepositoryCustom 

    @PersistenceContext
    EntityManager entityManager;

    @SuppressWarnings("all")
    @Override
    public List<MainPojoclass> getGRDetails(MainPojoclass et,Date rdate) 
String queryStr = "select et.Salss_DTE from table et"
                + " join dte etr on et.Salss_DTE = etr.Salss_DTE where et.nbr =? ";
        
        List<MainPojoclass> datalist = null;
                
        Query query =   entityManager.
                createNativeQuery(queryStr,"mapping")
                .setParameter(1, 222);
        datalist = query.getResultList();

        return datalist;

    


【问题讨论】:

【参考方案1】:

错误表明没有列 exc_seq_nbr,您在 EntityResult 映射中使用了该列。

在您的查询中,您只返回 et.SLS_DTE 您必须返回结果集映射中的所有列。

【讨论】:

您好,感谢您的回复,我更改了查询并选择了所有列仍然得到完全相同的错误【参考方案2】:

大家好,因为我没有得到任何解决方案,我将使用下面的解决方案,它对我有用,并且在没有 sql 结果集映射的情况下删除下面代码的 @SqlResultSetMapping 也可以工作

Query q = em.createNativeQuery(queryStr);
List<Object[]> resultList = q.getResultList();

for (Object[] result : resultList) 
   entityObj.setReason(result[0].toString);
//rest attribute will convert from result[1].toString to corresponding
// data type and set to entity object

【讨论】:

以上是关于JPA 本机查询结果集映射到具有子类的实体类的主要内容,如果未能解决你的问题,请参考以下文章

EclipseLink 拒绝将 PostgreSQL 上的本机查询映射到实体

使用 JPA 2.1,我如何将本机查询结果映射到 @Transient 字段(taht is a Set)?

JPA:如何将原生查询结果集转换为 POJO 类集合

本机 SQL(用 xml 编写)结果集映射到 POJO(基于注释)

jpa 结果集映射抛出 NPE

Mybatis结果集映射(resultMap)