我不能对连接表使用排序。让我解释一下;
我有三张桌子。用户、角色和user_roles。我的JPA实体是User、UserRole、UserRolePK、Role。
|User | | UserRole | | UserRolePK | | Role |
|--------| |----------| -------------- --------
|id | | pk | | user | | id |
|name | | role | | name |
实际上我想要的输出是:"SELECT * FROM user_roles ur JOIN users u ON u.ID = ur.UserID ORDER BY u.name;“
所以我尝试使用hibernate criteria API。
CriteriaImpl criteria = (CriteriaImpl) session.createCriteria(UserRole.class);
criteria.addOrder(Order.asc("pk.user.name"));
List userRoles = criteria.list();
错误是无法解析: models.UserRole的属性: pk.user.name
如何在join表上使用criteria API?
发布于 2010-09-02 21:49:44
如果一个类引用了其他类,则不能简单地以限制和顺序访问它们的属性。您必须为引用的对象创建别名,然后使用该别名来定义对其他对象的限制和顺序。
Criteria criteria = (CriteriaImpl) session.createCriteria(UserRole.class);
criteria.createAlias("pk", "a1");
criteria.createAlias("a1.user", "a2");
criteria.addOrder(Order.asc("a2.name"));
List userRoles = criteria.list();
别名定义将创建与其他类的表的联接。只有直接映射到类的表或别名的属性才能在限制或顺序中使用。如果您的类包含组件,则无需别名即可直接访问这些组件。
发布于 2010-09-02 21:44:40
首先,我认为我们应该看到你的实体映射(Java类)
另一方面,我假设您的UserRole类有一个对User实例的引用。
@Entity
@Table (name="UserRole")
public class UserRole{
User user;
@OneToMany //correct mapping here
public User getUser(){return this.user;}
}
您应该使用createCriteria
来导航association。
public List<UserRole> getRolesWithUser(){
Criteria userRoleCriteria = session.createCriteria(UserRole.class);
userRoleCriteria.createCriteria("user"); //joins the table.
userRoleCriteria.addOrder("user.name"); //adds order
return criteria.list();
}
这样做的问题是它会带来UserRole
的实例,但您可以导航到User
。
List<UserRole> userRoles = getRolesWithUser();
for (UserRole role:userRoles){
User user = role.getUser();
//do something with role , user
}
看一看Criteria API。它总是很有帮助!
发布于 2010-09-02 21:48:49
只要在关联上使用createCriteria就很容易了:
Criteria c=session.createCriteria(User.class)
.createCriteria("roles")
.add(Restrictions.eq("name","test")
.list();
这将连接Entites用户及其关联的集合“角色”的两个表。并且将返回具有与其自身相关联的角色的所有用户,该角色被称为"test“。
希望这能有所帮助
https://stackoverflow.com/questions/3627550
复制相似问题