9

和有什么区别:

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"))
4

1 回答 1

7

Property.forName("propName")总是返回匹配的Property实例。

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

有关更多详细信息,请参阅

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

在第三个代码片段中,您将获取 的实例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作为第二个参数。所以最终两者的工作是相同的。

于 2013-07-17T13:40:23.500 回答