我有许多域/业务对象,当在hibernate标准中使用时,它们被字段名作为字符串引用,例如:
Criteria crit = session.createCriteria(User.class);
Order myOrdering = Order.desc("firstname");
crit.addOrder(myOrdering);
其中firstname是User.class的字段/属性。
我可以手动创建一个Enum并存储所有的字符串;是否有其他的方式,我错过了,需要更少的工作(我可能会忘记维护Enum)。
恐怕没有好的办法。即使您决定使用反射,也只有在运行查询时才会发现问题。
但是有一个更好的解决方案如何发现问题的早期:如果你使用命名查询(javax.persistence.NamedQueries),你会得到你所有的查询编译一旦你的实体被Hibernate处理,所以基本上它会发生在服务器的启动。因此,如果某个对象的改变打破了查询,您将在下次启动服务器时知道它,而不是在实际运行查询时知道。
希望能有所帮助。
这是Hibernate让我恼火的一点。
在任何情况下,我在过去使用两种机制之一解决了这个问题,要么自定义用于从Hibernate配置文件生成基类的模板,要么询问Hibernate类的注释/属性,并从中生成适当的枚举、类、常量等。这很简单。
它为构建过程增加了一个步骤,但在我看来,这正是我所需要的。(前几个项目我没有这么做,但对于大型的、多开发的项目,我真的很喜欢。)