NamedQuery 返回具有空字段的实体

Posted

技术标签:

【中文标题】NamedQuery 返回具有空字段的实体【英文标题】:NamedQuery returning entities with null fields 【发布时间】:2021-12-31 01:34:57 【问题描述】:

将命名查询定义为SELECT mdl FROM tbl_slots mdl where mdl.test_date between :dt and :dt order by mdl.test_time asc的实体

如果在查询中使用* 而不是mdl,JPA 会给出错误unexpected token: *

如果在 select 语句中提到列名,它会返回实体,其中各个字段填充了预期值

[ “srNo”:1, “testDate”:“2021 年 12 月 30 日”, "testTime": "09:00-10:00", , “srNo”:2, “testDate”:“2021 年 12 月 30 日”, "testTime": "11:00-12:00", ]

如何在不提及列名的情况下在 select 语句中获得相同的结果,就像使用 *

select * from table 查询的有效 JPQL 或 HQL 是什么?

实体类

@Table(name = "tbl_slots")
@NamedQueries(
    @NamedQuery(name="slots",query = "SELECT mdl FROM tbl_slots mdl where  mdl.test_date between :dt and :dt order by mdl.test_time asc")
)
public class TblSlots implements Serializable 
    private Long srNo;
    private Date testDt;
    private String testTime;
        
    public TblSlots() 
    public TblSlots(Long srNo, Date testDt, String testTime) 
        this.srNo = srNo;
        this.testDt = testDt;
        this.testTime = testTime;
    
    
    @Id
    @Column(name = "sr_no", unique = true, nullable = false, precision = 16, scale = 0)
    public Long getSrNo() 
        return this.srNo;
    

    public void setSrNo(Long srNo) 
        this.srNo = srNo;
    

    @Temporal(TemporalType.DATE)
    @Column(name = "test_date", nullable = false, length = 13)
    public Date getTestDt() 
        return this.testDt;
    

    public void setTestDt(Date testDt) 
        this.testDt = testDt;
    

    @Column(name = "test_time", nullable = false, length = 20)
    public String getTestTime() 
        return this.testTime;
    

    public void setTestTime(String testTime) 
        this.testTime = testTime;
    

【问题讨论】:

【参考方案1】:

JPQL 理解 java 实体而不是列。

如何在不提及列名的情况下获得相同的结果选择 语句好像使用过 *?

什么是 select * from table 查询的有效 JPQL 或 HQL?

所以一个有效的 JQPL SELECT 查询甚至可以没有SELECT 子句。

以下将是一个有效的 JPQL 查询,用于从该表中返回完整的实体

FROM tbl_slots mdl where  mdl.test_date between :dt and :dt order by mdl.test_time asc

所以你的注释可以写成

@NamedQueries(
    @NamedQuery(name="slots",query = "FROM tbl_slots mdl where  mdl.test_date between :dt and :dt order by mdl.test_time asc")
)

【讨论】:

在 DAO 层中,它返回 query.setResultTransformer(Transformers.aliasToBean(TabScheduleSlots.class)).list(),因此即使在 select 语句中的表引用也无法正常工作,删除 setResultTransformer 方法调用并保持 list() 调用它开始显示我知道的预期结果由于 v5.2 已弃用,它主要用于自定义结果集输出的情况,但 我们如何使其与 setResultTransformer() 方法一起使用? @shreeramaute query.setResultTransformer(Transformers.aliasToBean(TblSlots.class)) 是正确的 抱歉打错了谢谢您纠正您的解决方案适用于正常的 query.list() 调用,但对于 query.setResultTransformer() 方法不起作用,它会为您提供的查询产生空指针异常 @shreeramaute 究竟是什么空指针错误? java.lang.NullPointerException: null org.hibernate.transform.AliasToBeanResultTransformer.initialize(AliasToBeanResultTransformer.java:98) org.hibernate.transform.AliasToBeanResultTransformer.transformTuple(AliasToBeanResultTransformer.java:68) org.hibernate .hql.internal.HolderInstantiator.instantiate(HolderInstantiator.java:85) org.hibernate.loader.hql.QueryLoader.getResultList(QueryLoader.java:508) org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2682) org .hibernate.loader.Loader.list(Loader.java:2677) org.hibernate.loader.hql.QueryLoader.list【参考方案2】:

你不能使用'*',因为Hibernate正在转动对象。 如果要使用 *,请使用 @NamedNativeQuery 而不是 @NamedQuery

@NamedQueries(
    @NamedQuery(name="slots",query = "SELECT mdl FROM Member mdl ")
)
// Use this
@NamedNativeQueries(
    @NamedNativeQuery(name="slots_native",query = "SELECT * FROM Member mdl ",resultClass = MemberEntity.class)
)

参考@NamedNativeQuery

【讨论】:

使用 ORM 让应用数据库独立,所以@carmel 不想去原生查询

以上是关于NamedQuery 返回具有空字段的实体的主要内容,如果未能解决你的问题,请参考以下文章

JsonView 返回空的 json 对象

javax.persistence NamedQuery 未按预期工作

NamedQuery:外部化实体后的 IllegalArgumentException(未找到查询)

从 JPA 实体的接口中检索 @NamedQuery

为啥元字符 * 不能在 JPA 的实体中的 NamedQuery 中使用?

如何将计算字段映射到 JPA 实体?