使用Hibernate,有没有办法避免在我的HQL / SQL / Criteria条件中使用String作为列名?

时间:2016-04-28 03:02:10

标签: java hibernate

在下面的标准条件中:

Criteria cr = session.createCriteria(Employee.class);
// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000));

首先,“salary”是我的Employee实体的属性还是数据库表的一列?

其次,如果我想更改/删除此“薪水”,我是否必须搜索所有查询以更新它们?

2 个答案:

答案 0 :(得分:1)

我认为您正在寻找的是hibernate的metamodel生成器。这是一个构建时工具,可以从每个实体生成一个新类,并使用适当的注释来允许您使用生成的类'标准查询中的字段而不是字符串。

对于您的示例,您可以编写

cr.add(Restrictions.gt(Employee_.salary, 2000));

重构时唯一的问题是IDE重构工具在重构实体时重构使用生成的元模型类似乎并不聪明。解决方法是重构实体并在生成的类上执行相同的重构。虽然生成的类中的重构不是直接必需的(它将通过更改重新生成),但它具有重构必须更改的元模型类的所有用法的效果。

如果您要从salary实体中删除Employee,它将自动从生成的Employee_元模型类中删除。这会为所有提及salary的查询提供编译错误。这比替代方法要好得多,其中一切都在继续编译,但在执行查询时失败。

答案 1 :(得分:0)

  

首先,“salary”是我的Employee实体的属性还是数据库表的一列?

是的,salary是Employee实体的属性,而不是数据库表列名。

  

其次,如果我想更改/删除此“薪水”,我是否必须搜索所有查询以更新它们?

如果您从员工中删除工资字段,则还必须从查询中删除。