我的项目有问题.我正在尝试创建一个搜索功能来搜索用户表中的用户,但与此同时,我还想从另一个头像表中检索用户头像的相应" url ".我想在这两个表之间创建一个硬映射.如何使用Hibernate Criteria灵活地完成它?两个表都使用" loginID "的主键.
我有两节课:
public class User{
private String loginID;
private String screenname;
......
}
public class Avatar{
private Integer id;
private String loginID;
private String url;
.......
}
Run Code Online (Sandbox Code Playgroud)
我写的:
public List<Users> searchLogin(String keywords, int startFrom) {
List<Users> userList = new ArrayList<Users>();
try {
Session session = HibernateUtil.beginTransaction();
Criteria criteria = session.createCriteria(Users.class,"users");
criteria.add(Restrictions.ilike("loginID", keywords, MatchMode.ANYWHERE));
userList = criteria.list();
if (session.isOpen()) {
session.close();
}
return userList;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
多谢你们!!
迟到了,但对于那些真正谷歌并最终到此的人来说,它可能会有用.无需映射或使用HQL.
这是如何做:
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Tuple> criteria = builder.createTupleQuery();
Root<EntityA> entityARoot= criteria.from(EntityA.class);
Root<EntityB> entityBRoot = criteria.from(EntityB.class);
//Predicates
List<Predicate> predicates = new ArrayList<>();
//Add the predicates you need
//And predicates
List<Predicate> andPredicates = new ArrayList<>();
andPredicates.add(builder.equal(entityARoot.get("id"), entityBRoot.get("id")));
andPredicates.add(builder.and(predicates.toArray(new Predicate[0])));
criteria.multiselect(entityARoot, entityBRoot);
criteria.where(andPredicates.toArray(new Predicate[0]));
TypedQuery<Tuple> query = em.createQuery(criteria);
List<Tuple> result = query.getResultList();
Run Code Online (Sandbox Code Playgroud)
使用HQL
from User u,Avatar a where where u.loginID = a.loginID and u.loginID = :loginID
Run Code Online (Sandbox Code Playgroud)
这将返回 [User,Avatar] 数组的列表。
| 归档时间: |
|
| 查看次数: |
23024 次 |
| 最近记录: |