Java Hibernate和String主键,大小写感知加载
我的数据库中有一个tlogin表,它有一个Java Hibernate和String主键,大小写感知加载,java,hibernate,Java,Hibernate,我的数据库中有一个tlogin表,它有一个String类型的主键,名为Login。此密钥不是由Hibernate自动生成的,因为它是由应用程序分配的。这里是映射: <id name="_Login" column="Login" unsaved-value="null"> <generator class="assigned" /> </id> 例如,这里甚至用户名也存储为example@hotmail.com在数据库中,如果最终用户使用EXAMPL
String
类型的主键,名为Login。此密钥不是由Hibernate自动生成的,因为它是由应用程序分配的。这里是映射:
<id name="_Login" column="Login" unsaved-value="null">
<generator class="assigned" />
</id>
例如,这里甚至用户名也存储为example@hotmail.com在数据库中,如果最终用户使用EXAMPLE@hotmail.com,它将从数据库中检索对象,但使用EXAMPLE@hotmail.com按键。我想允许用户访问该应用程序,但我想获取存储在数据库中的用户名
我必须为此实现一个标准吗?我个人会选择(作为命名查询)
但是还有其他的方法
看
我个人会选择(作为命名查询)
但是还有其他的方法
看
我最终实现了使用Hibernate标准来解决它。除了
MatchMode.Exact
之外,我还使用了ilike
限制,这是一种不敏感的like类型,只允许过滤精确匹配
这就是它的工作原理:
public CLogin loadLogin(String userName) throws AccessException {
try {
Session sesion = this._dao.init();
CLogin login = (CLogin) sesion.createCriteria(CLogin.class).add(
Restrictions.ilike("_Login", userName.toLowerCase(), MatchMode.EXACT))
.uniqueResult();
if (login == null) {
throw new AccessException("User does not exist");
}
return login;
} catch (HibernateException e) {
throw new AccessException(e.getMessage(), e);
}
}
我最终实现了使用Hibernate标准来解决它。除了
MatchMode.Exact
之外,我还使用了ilike
限制,这是一种不敏感的like类型,只允许过滤精确匹配
这就是它的工作原理:
public CLogin loadLogin(String userName) throws AccessException {
try {
Session sesion = this._dao.init();
CLogin login = (CLogin) sesion.createCriteria(CLogin.class).add(
Restrictions.ilike("_Login", userName.toLowerCase(), MatchMode.EXACT))
.uniqueResult();
if (login == null) {
throw new AccessException("User does not exist");
}
return login;
} catch (HibernateException e) {
throw new AccessException(e.getMessage(), e);
}
}
如果我必须这样做,我会尝试按照SQL的顺序作为HQL查询。对不起,我无法判断您是否使用JPA,但如果是这样,我发现NamedQueries或PreparedStatements非常干净,当然可以避免SQL注入。是的,关于Hibernate本身的问题,我当然使用JPA访问。看看我最终的解决方案。无论如何,谢谢。如果我必须这样做,我会尝试按照SQL的顺序作为HQL查询。很抱歉,我无法判断您是否在使用JPA,但如果是这样,我发现NamedQuery或PreparedStatements非常干净,当然也避免了SQL注入。是的,关于Hibernate本身的问题,我当然使用JPA访问。看看我最终的解决方案。不管怎样,谢谢。我也将进入这一步。我使用namedQuery修复了它,但我不想编写自定义方法来获取用户信息或criteriaQuery。我想知道为什么默认的find()或get()方法在这种情况下不起作用。你能帮我个忙吗?我也要开始这一步了。我使用namedQuery修复了它,但我不想编写自定义方法来获取用户信息或criteriaQuery。我想知道为什么默认的find()或get()方法在这种情况下不起作用。你能帮我吗?
public CLogin loadLogin(String userName) throws AccessException {
try {
Session sesion = this._dao.init();
CLogin login = (CLogin) sesion.createCriteria(CLogin.class).add(
Restrictions.ilike("_Login", userName.toLowerCase(), MatchMode.EXACT))
.uniqueResult();
if (login == null) {
throw new AccessException("User does not exist");
}
return login;
} catch (HibernateException e) {
throw new AccessException(e.getMessage(), e);
}
}