明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
随笔 - 1277, 文章 - 0, 评论 - 214, 阅读 - 320万
  博客园  :: 首页  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

jpa 使用HQL查询视图的结果与数据库用sql查询的结果不一致的问题让我碰到了,以前从来没遇到过,第一次遇到搞得我郁闷了一天,终于找到问题的所在:

原因:

因为用jpa的HQL语句写自定义查询sql,所以直接是用Entiy实体类接收结果(也就是说查出什么字段实体属性就有什么字段),由于查出来的字段没有一个是唯一的,然而看了jpa文档了解到jpa要求有唯一的字段,因此查询出来的结果不一致。

解决方法:

(1)给视图或者表提供一个唯一的字段即可,比如oracle或者mysql的rownum函数,不同数据库可用row_num、row_id等,比如我用的PostgreSQL ,则是需要加row_number() OVER () AS row_num ,并在实体类加上row_num变量来接收查询结果

(2)如果是视图查询那就在视图sql的实际表中返回一个表里唯一的字段作为视图的唯一字段,然后在实体类上定义唯一字段,本人是第二种情况,所以直接用表里的BID返回。

本人的实际代码如下:

实体类:IpoBillDetailEntity,view_ele_ipo_billdetail是对应的数据库视图

复制代码
@Entity
@Table(name = "view_ele_ipo_billdetail", schema = "ADAPTER")
public class IpoBillDetailEntity {

    /**
     * 视图主键ID,注意这里要加主键@ID,此字段唯一,也是解决上述问题的关键之一
     */
    @Id
    @Column(name = "bid")
    private String bid;
 
    /**
     * 注意这里要加实体类属性的映射字段 , 也是解决上述问题的关键之二
     */
    @Column(name = "order_sn")
    private String orderSn;

    。。。。后面字段同上。。。。
 
   }
复制代码

 

jpa的JpaRepository类:

public interface IpoBillDetailRepository extends JpaRepository<IpoBillDetailEntity, String> {
 
   
    @Query("select t from IpoBillDetailEntity t where t.hospitalId = ?2 and t.compoundId = ?3 and t.inpatientSn = ?1")
    List<IpoBillDetailEntity> queryIpoBillDetailEntitiesByInpatientSn(String inpatientSn, String hospitalId, String compoundId);
 
}

 

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2016-07-18 C#:调用webservice时提示对操作的回复消息正文进行反序列化时出错
点击右上角即可分享
微信分享提示