我的项目有问题。我正在尝试创建一个搜索功能来搜索用户表中的用户,但与此同时,我还想检索相应的" 网址"来自另一个头像表的用户头像。我想在这两个表之间创建一个硬映射。如何使用Hibernate Criteria灵活地完成它?两个表都使用" loginID "的主键。
我有两个班级:
public class User{
private String loginID;
private String screenname;
......
}
public class Avatar{
private Integer id;
private String loginID;
private String url;
.......
}
我写的:
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;
}
}
谢谢你们!
答案 0 :(得分:8)
很晚,但对于那些实际谷歌并最终到此处的人来说,它可能会有用。 无需映射或使用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();
答案 1 :(得分:3)
使用HQL
from User u,Avatar a where where u.loginID = a.loginID and u.loginID = :loginID
这将返回[User,Avatar]数组的列表。
答案 2 :(得分:2)
两个表都使用“loginID”的主键。
这是对的吗?我看到Avatar
类有一个名为'id'的字段,这不是id / primary key吗?
我还注意到您使用Avatar
字段从User
引用loginId
。链接实体的正确方法是由他们的班级。使用注释应该如下所示:
@Entity
public class User
{
@Id
private String loginId;
private String screenName;
@OneToOne(mappedBy = "user")
private Avatar avatar;
}
@Entity
public class Avatar
{
@Id
private Integer id;
@OneToOne
private User user;
private String url;
}
如果您想要获取User
以及属于Avatar
的{{1}}的网址,您可以做的最好的事情就是获取User
并且{ {1}}使用加入,然后访问User
的网址,从而无需从Avatar
转换为Avatar
和Object
保留类型安全。
User