您是否考虑过使用@NamedQuery
呢?这是一种将查询语句静态定义并命名的方式,使得代码更加整洁且易于管理。下面是一个示例:
@Entity
@NamedQueries({
@NamedQuery(
name = "person.findByNameLike",
query = "from Person where name like :name"
),
@NamedQuery(
name = "person.deleteByNameLike",
query = "delete from Person where name like :name"
)
})
public class Person {
@Id
private long id;
private String name;
}
在此例中,我们定义了两个命名查询:一个用于根据名称模糊查找Person
实体,另一个用于根据相似名称删除记录。
接下来,可以在数据访问对象(DAO)中使用这些命名查询,例如:
public class PersonDao {
private final Session session;
public PersonDao(Session session) { this.session = session; }
public List<Person> findByNameLike(String name) {
Query<Person> query = session.createNamedQuery("person.findByNameLike", Person.class);
query.setParameter("name", "%" + name + "%");
return query.getResultList();
}
public int deleteByNameLike(String name) {
// 注意:此处假设存在createNamedMutationQuery方法用于处理DML操作,实际API中并不存在精确对应方法,应使用createNamedQuery后调用executeUpdate。
MutationQuery query = session.createNamedMutationQuery("person.deleteByNameLike");
query.setParameter("name", "%" + name + "%");
return query.executeUpdate();
}
}
请注意,上述代码中的createNamedMutationQuery
方法是示意性的,实际上Hibernate没有直接提供这样的方法。对于删除或更新操作,您应该继续使用createNamedQuery
方法,然后调用executeUpdate
来执行操作,如下面修正的deleteByNameLike
方法所示:
public int deleteByNameLike(String name) {
Query query = session.createNamedQuery("person.deleteByNameLike");
query.setParameter("name", "%" + name + "%");
return query.executeUpdate();
}
通过这种方式,您可以避免使用已废弃的createQuery
方法直接处理字符串HQL,同时提升代码的可读性和维护性。有关更多信息,请参考《Baeldung上的Hibernate Named Query教程》。