我何时或为何使用Property.forName()?

时间:2013-07-17 12:54:24

标签: hibernate hibernate-criteria

有什么区别:

List cats = session.createCriteria(Cat.class)  
.add( Restrictions.like("name", "F%")
.list();   

List cats = session.createCriteria(Cat.class)  
.add( Property.forName("name").like("F%") )  
.list(); 

或者就此而言,区别在于:

Criteria cr = session.createCriteria(User.class)
    .setProjection(Projections.projectionList() 
    .add(Property.forName("id").as("id")) 
    .add(Property.forName("name").as("name"))

Criteria cr = session.createCriteria(User.class)
    .setProjection(Projections.projectionList()
    .add(Projections.property("id"), "id")
    .add(Projections.property("Name"), "Name"))

1 个答案:

答案 0 :(得分:7)

Property.forName("propName")始终会返回匹配的Property实例。

话虽如此,意味着您的问题中发布的前两个代码段之间没有区别。如果您需要在条件查询中多次使用该属性,则应使用Property.forName("propName")。它相当于使用直接编号。 (e.g. 11)或使用分配给no的变量。 (e.g. int x = 11)并在每次需要使用编号时使用变量。

有关详细信息,请参阅this

现在,如果我谈论第二个问题(第3和第4段代码片段),两者的工作方式是相同的。唯一的区别在于使用的API。

在第3段代码中,您将获得Property的实例,调用其as()方法,该方法用于为该特定属性生成别名并返回SimpleProjection (subclass of Projection)的实例。

在第4段代码段中,您通过PropertyProjection (subclass of Projection)获得了Projections.property("Name")的实例。

因此,在这两种情况下,您都会获得Projection的实例,并将其添加到ProjectionsList。现在ProjectionList有2个称为add()的重载方法。在第三个代码段中,您调用的add()只接受Projection的实例作为参数。在第4个代码段中,您调用的是add()的另一个版本,它将Projection的实例作为第一个参数& alias for the property of Projection作为第二个参数。所以最终两者的合作都是一样的。