有什么区别:
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"))
答案 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
作为第二个参数。所以最终两者的合作都是一样的。