Hibernate 何时或为什么使用Property.forName()?
以下两者之间的区别是什么:Hibernate 何时或为什么使用Property.forName()?,hibernate,hibernate-criteria,Hibernate,Hibernate Criteria,以下两者之间的区别是什么: List cats = session.createCriteria(Cat.class) .add( Restrictions.like("name", "F%") .list(); Criteria cr = session.createCriteria(User.class) .setProjection(Projections.projectionList() .add(Property.forName("id").as("id"
List cats = session.createCriteria(Cat.class)
.add( Restrictions.like("name", "F%")
.list();
Criteria cr = session.createCriteria(User.class)
.setProjection(Projections.projectionList()
.add(Property.forName("id").as("id"))
.add(Property.forName("name").as("name"))
及
或者就此而言,以下两者之间的区别:
List cats = session.createCriteria(Cat.class)
.add( Restrictions.like("name", "F%")
.list();
Criteria cr = session.createCriteria(User.class)
.setProjection(Projections.projectionList()
.add(Property.forName("id").as("id"))
.add(Property.forName("name").as("name"))
及
Property.forName(“propName”)
始终返回匹配的属性
实例
话虽如此,这意味着问题中发布的前两个代码片段之间没有区别。当您需要在条件或查询中多次使用该属性时,应使用属性.forName(“propName”)
。这相当于使用直接编号(如11
)或使用分配给编号的变量(如int x=11
),并在每次需要使用编号时使用变量
有关更多详细信息,请参阅
现在,如果我谈论第二个问题(第三个和第四个代码片段),那么这两个问题的工作原理是相同的。唯一的区别在于所使用的API
在第三个代码片段中,您将获得属性的实例
,调用其as()
方法,该方法用于为该特定属性生成别名,并返回SimpleProject(投影的子类)
的实例
在第四个代码片段中,您通过执行Projections.property(“Name”)
获得了PropertyProjection(投影的子类)
的实例
因此,在这两种情况下,您都得到了
投影的实例,您正在将其添加到投影列表中。现在ProjectionList有两个重载方法,称为add()
。在第三个代码段中,您正在调用add()
,它只将投影的实例作为参数。在第4个代码段中,您正在调用另一个版本的add()
,它将投影的实例作为第一个参数&投影属性的别名作为第二个参数。因此,最终两者的工作原理是相同的。因此,在第三个代码片段中,当我调用方法add(Projection)
时,我也给出了别名信息。在第四个代码片段中,我通过调用方法add(Projection,alias)
来提供别名信息。是吗?在这两种情况下都会传递别名信息。使用的API是不同的。您可以通过两种方式为属性指定别名:1。使用Property.as(“别名”)
2。使用投影列表。添加(投影,别名)
。