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 返回具有空字段的实体的主要内容,如果未能解决你的问题,请参考以下文章
javax.persistence NamedQuery 未按预期工作
NamedQuery:外部化实体后的 IllegalArgumentException(未找到查询)