编写DAO方法以通过电子邮件检索appUsers,其中电子邮件是EmailAddress类。一直在寻找如何做到这一点无济于事。有没有办法根据自定义对象的值检索记录?当我有一个String或int类型的属性但是如何获得与我的EmailAddress对象匹配的记录时,这似乎有效?
尝试以下但不起作用:
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;
}
}
这是我的电子邮件地址类
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;
}
}
谢谢!
将您的查询更改为:
List results = this.sessionFactory.getCurrentSession()
.createQuery("select au from AppUser au where au.email = :email")
.setParameter("email", email)
.list();
您需要实现Hibernate custom UserType以在加载时将DB字符串转换为EmailAddress。
使用ImmutableType
项目中的hibernate-types
作为自定义Hibernate Type
的基类,因为它更容易实现。
将相关更改发布到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);
}
}