Hibernate 5.3中如何用表名替代模型名编写HQL查询?
当然可以实现啦!在Hibernate 5.3里,你有两种实用的方式来达成用数据库表名vendors编写查询的需求,咱们一个个来看:
方法1:直接用原生SQL查询(完全基于表名)
Hibernate原生支持直接执行数据库SQL语句,你可以直接写基于vendors表的查询,同时让Hibernate自动把结果映射回你的Vendor实体类。修改你的代码如下:
try(Session session = getSession()) { session.beginTransaction(); // 使用createNativeQuery,传入SQL语句和目标实体类 Query<Vendor> query = session.createNativeQuery("SELECT * FROM vendors WHERE name = :name", Vendor.class); query.setParameter("name", name); List<Vendor> vendors = query.getResultList(); session.getTransaction().commit(); return vendors.get(0); }
这种方式完全贴合你用表名写查询的需求,和普通SQL写法一致,适合你想直接操作表结构的场景。
方法2:修改实体的HQL别名(兼顾HQL特性和可读性)
如果你还是想继续使用HQL(面向对象的查询语言),但希望查询语句里的名称和表名保持一致,可以通过@Entity注解的name属性,把实体在HQL中的别名设置为vendors:
@Entity(name = "vendors") // 这里指定HQL中使用的实体别名是vendors @Table(name = "vendors") // 这是数据库实际对应的表名 public class Vendor { // 你的实体字段、getter/setter等内容 }
做完这个配置后,你就能在HQL里用vendors代替原来的Vendor来写查询了:
try(Session session = getSession()) { session.beginTransaction(); Query<Vendor> query = session.createQuery("from vendors where name = :name", Vendor.class); query.setParameter("name", name); List<Vendor> vendors = query.getResultList(); session.getTransaction().commit(); return vendors.get(0); }
这种方式本质上还是HQL,只是把实体在查询中的名称改成了和表名一致,既保留了HQL面向对象的优势,又满足了你想要的可读性要求。
需要注意的是,HQL本身是面向实体的查询语言,默认用实体类名编写,但通过上面两种方法,你完全不用局限于实体类名,能轻松实现用表名(或和表名一致的名称)来编写查询。
内容的提问来源于stack exchange,提问作者user6467981
相关产品推荐
相关产品推荐

