使用@NaturalId的两个唯一键的Hibernate实体

时间:2017-03-30 22:57:27

标签: java hibernate

我需要一个具有主键ID和两个唯一非空(非主键)的用户实体:电子邮件和用户名。然后我收到一个用户名和一封电子邮件,我需要检索一个收到用户名或电子邮件的用户实体。

我看到@NaturalId使列唯一且不为null。问题是,当你有多个@NaturalId时,Hibernate会在该对上创建一个唯一索引(电子邮件,用户名),这意味着它不会是任何具有相同对的行(电子邮件,用户名),但它可能会出现一个有相同的电子邮件但用户名不同。

可以用@NaturalId解决吗?如果可能,我将如何检索与收到的用户名或电子邮件匹配的实体,但不一定都是。

如果不可能,这会是最佳解决方案吗?

 final Session session = HibernateUtil.openSession();
 final CriteriaBuilder builder = session.getCriteriaBuilder();
 final CriteriaQuery<User> criteria = builder.createQuery(User.class);
 final Root<User> userRoot = criteria.from(User.class);

 criteria.where(builder.equal(userRoot.get("username"), username));
 /* How do I join the criteria for username and email using ||?
 So that it gets me an entity that has that email or username. */

 final User foundUser = session.createQuery(criteria).uniqueResult();

1 个答案:

答案 0 :(得分:0)

您的查询将会:

  Session session = HibernateUtil.getSession();
    Criteria criteria = session.createCriteria(User.class);
    criteria.add(Restrictions.disjunction()
                    .add(Restrictions.eq("username", value))
                    .add(Restrictions.eq("email", value)));
    User user = (User)criteria.setMaxResults(1).uniqueResult();

Hql查询:

 Query query = session.createQuery("from User as s where s.username = :userInputValue or s.email =:userInputValue");
        query.setParameter("userInputValue", userInputValue);
        query.setMaxResults(1);
        User user = (User) query.uniqueResult();

您无法获得给定结果的唯一结果,因为正如您所提到的,我们可能有2行,其中一行的用户名为&#34; Jom@test.com"另一行有电子邮件&#34; Jom@test.com"。 因此,可能的情况是不能获得独特的价值,因为修复它你需要对任何一个字段做出2个唯一约束,基本上你需要在一行中有2个唯一的字段。