我不能在连接表上使用排序。让我解释一下;
我有三张桌子。用户,角色和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();
错误是 无法解析属性:pk.user.name:models.UserRole
如何在连接表上使用条件API?
答案 0 :(得分:10)
如果某个类引用其他类,则无法在“限制和订单”中简单地访问其属性。您必须为引用的对象创建别名,然后使用别名在其他对象上定义限制和订单。
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();
别名定义将创建与其他类的表的连接。只有直接映射到类表或别名的属性才能在限制或订单中使用。如果您的类包含组件,则可以直接访问它们而无需别名。
答案 1 :(得分:1)
好吧,首先我认为我们应该看到你的实体映射(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。它总是很有用!
答案 2 :(得分:1)
在关联上使用createCriteria非常简单:
Criteria c=session.createCriteria(User.class)
.createCriteria("roles")
.add(Restrictions.eq("name","test")
.list();
这将为Entites用户及其关联的Collection“角色”加入两个表。并将返回所有与自己相关联的角色称为“test”的用户。
希望有所帮助