【问题标题】:NamedQuery returning entities with null fieldsNamedQuery 返回具有空字段的实体
【发布时间】: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;
    }

【问题讨论】:

    标签: java spring-boot hibernate spring-data-jpa orm


    【解决方案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 不想去原生查询
    猜你喜欢
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    相关资源
    最近更新 更多