2014-12-04 68 views
1

编写DAO方法以通过电子邮件检索appUsers,其中电子邮件是EmailAddress类。一直在寻找如何做到这一点无济于事。有没有办法根据自定义对象的值检索记录?这似乎工作时,我有一个属性是String或int类型,但我如何获得匹配我的EmailAddress对象的记录?通过自定义对象属性查找Hibernate

试过以下,但不工作:

public List<AppUser> findByEmail(EmailAddress email) { 
    log.debug("finding " + getTable() + " instance by example"); 

    AppUser appUser = new AppUser(); 
    appUser.setEmail(email); 

    try { 
     List<AppUser> results = this.sessionFactory.getCurrentSession() 
       .createCriteria(AppUser.class) 
       .add(Example.create(appUser)).list(); 
     log.debug("find by example successful, result size: " 
       + results.size()); 
     return results; 
    } catch (RuntimeException re) { 
     log.error("find by example failed", re); 
     throw re; 
    } 
} 

这里的是我的APPUSER类

@Entity 
@Table(name="AppUser") 
public class AppUser extends BaseEntity { 
    ... 

    @Column(name="Email") 
    private EmailAddress email; 

    ... 

    /** 
    * Gets this AppUser's associated email 
    * 
    * @return this AppUser's associated email 
    */ 
    public EmailAddress getEmail() { 
     return this.email; 
    } 

    /** 
    * Sets this AppUser's associated email 
    * 
    * @param email this AppUser's associated email 
    */ 
    public void setEmail(EmailAddress email) { 
     this.email = email; 
    } 
} 

的相关部分这里是我的EmailAddress的类

public class EmailAddress implements Serializable { 
    private static final long serialVersionUID = -6999956021169014445L; 
    private static final String AT_DELIMTER = "@"; 
    private String emailAddress; 

    public EmailAddress() {} 

    public EmailAddress(String emailAddress) { 
     setEmailAddress(emailAddress); 
    } 

    public String getEmailAddress() { 
     return emailAddress; 
    } 

    public void setEmailAddress(String emailAddress) throws IllegalArgumentException { 
     if (StringUtils.isEmpty(emailAddress)) 
      throw new IllegalArgumentException("Parameter emailAddress cannot be blank."); 
     else if (!EmailValidator.getInstance(true).isValid(emailAddress)) 
      throw new IllegalArgumentException("The email address " + emailAddress + " is not valid."); 

     this.emailAddress = emailAddress; 
    } 

    public String getUser() { 
     return this.emailAddress.substring(0, this.emailAddress.indexOf(AT_DELIMTER)); 
    } 

    public String getDomain() { 
     return this.emailAddress.substring(this.emailAddress.indexOf(AT_DELIMTER) + 1); 
    } 

    public String toString() { 
     return emailAddress; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result 
       + ((emailAddress == null) ? 0 : emailAddress.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     EmailAddress other = (EmailAddress) obj; 
     if (emailAddress == null) { 
      if (other.emailAddress != null) 
       return false; 
     } else if (!emailAddress.equals(other.emailAddress)) 
      return false; 
     return true; 
    } 
} 

谢谢!

回答

2

更改您查询到:

List results = this.sessionFactory.getCurrentSession() 
      .createQuery("select au from AppUser au where au.email = :email") 
      .setParameter("email", email) 
      .list(); 

你需要实现一个Hibernate custom UserType在加载到数据库字符串转换为EmailAddress的。

+0

嗯......一定有别的事情就在这里,因为这仍然不返回任何结果。这真的很奇怪,因为当我将属性字段作为字符串时,它起作用,但只要我将其更改为EmailAddress,它就不会返回任何结果。假设Hibernate可以进行这种翻译,我错了吗? – malificent 2014-12-04 15:58:56

+0

检查我更新的答案。 – 2014-12-04 16:05:09

+0

啊谢谢!得到了那个工作! – malificent 2014-12-04 17:05:13

0

发布的情况下,任何人都有关更改EmailAddress的类希望看到他们:

public class EmailAddress implements UserType { 
    ... 
    @Override 
    public int[] sqlTypes() { 
     return new int[] {Types.NVARCHAR}; 
    } 

    @Override 
    public Class<EmailAddress> returnedClass() { 
     return EmailAddress.class; 
    } 

    @Override 
    public boolean equals(Object x, Object y) throws HibernateException { 
     if (x == y) 
      return true; 
     if (y == null) 
      return false; 
     if (getClass() != y.getClass()) 
      return false; 
     EmailAddress emailAddressX = (EmailAddress) x; 
     EmailAddress emailAddressY = (EmailAddress) y; 
     if (emailAddressX.getEmailAddress() == null) { 
      if (emailAddressY.getEmailAddress() != null) 
       return false; 
     } else if (!emailAddressX.getEmailAddress().equals(emailAddressY.getEmailAddress())) 
      return false; 
     return true; 
    } 

    @Override 
    public int hashCode(Object x) throws HibernateException { 
     final int prime = 31; 
     int result = 1; 
     EmailAddress emailAddress = (EmailAddress) x; 

     result = prime * result 
       + ((emailAddress == null) ? 0 : emailAddress.hashCode()); 
     return result; 
    } 

    @Override 
    public Object nullSafeGet(ResultSet rs, String[] names, 
      SessionImplementor session, Object owner) 
      throws HibernateException, SQLException { 
     EmailAddress emailAddress = null; 

     String value = rs.getString(names[0]); 
     if (!rs.wasNull()) { 
      emailAddress = new EmailAddress(value); 
     } 

     return emailAddress; 
    } 

    @Override 
    public void nullSafeSet(PreparedStatement st, Object value, int index, 
      SessionImplementor session) throws HibernateException, SQLException { 
     EmailAddress emailAddress = (EmailAddress) value; 
     st.setString(index, emailAddress.getEmailAddress()); 
    } 

    @Override 
    public Object deepCopy(Object value) throws HibernateException { 
     return value; 
    } 

    @Override 
    public boolean isMutable() { 
     return false; 
    } 

    @Override 
    public Serializable disassemble(Object value) throws HibernateException { 
     return (Serializable) deepCopy(value); 
    } 

    @Override 
    public Object assemble(Serializable cached, Object owner) 
      throws HibernateException { 
     return deepCopy(cached); 
    } 

    @Override 
    public Object replace(Object original, Object target, Object owner) 
      throws HibernateException { 
     return deepCopy(original); 
    } 
}