使用Hibernate Criteria从多个表中检索数据而不使用实体映射设置

时间:2012-09-05 23:18:58

标签: java hibernate

我的项目有问题。我正在尝试创建一个搜索功能来搜索用户表中的用户,但与此同时,我还想检索相应的" 网址"来自另一个头像表的用户头像。我想在这两个表之间创建一个硬映射。如何使用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;
        }
    }

谢谢你们!

3 个答案:

答案 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转换为AvatarObject保留类型安全。

User