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

ins*_*ity 9 hibernate hibernate-criteria

有什么区别:

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

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

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

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

Criteria cr = session.createCriteria(User.class)
    .setProjection(Projections.projectionList()
    .add(Projections.property("id"), "id")
    .add(Projections.property("Name"), "Name"))
Run Code Online (Sandbox Code Playgroud)

RAS*_*RAS 7

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

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

有关详细信息,请参阅此处.

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

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

虽然在第四代码段,你得到的情况下PropertyProjection (subclass of Projection)这样做Projections.property("Name").

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