我的数据库包含下表:
表:
country {
code varchar(255) not null
primary key
};
类:
@Entity
public class Country {
@Id
@Column(name = "code")
private String mCode;
public String getCode() {
return mCode;
}
public void setCode(String code) {
mCode = code;
}
}
样本表行:
| code |
|------|
| USA |
| UK |
当我使用以下CrudRepository检索国家/地区时:
public interface CountryRepository extends CrudRepository
第一种情况:
mRepository.findOne("USA")
它将在我的休息api中给出以下结果:
{
"code": "USA"
}
第二种情况:
mRepository.findOne("UsA")
它将在我的休息api中给出以下结果:
{
"code": "UsA"
}
第三种情况:
mRepository.findOne("Usa")
它将在我的休息api中给出以下结果:
{
"code": "Usa"
}
我还使用调试器检查了相同的行为,发现我在内存中的对象实际上具有相同的行为.
我想要的:我希望返回的数据与数据库中的数据相同.
最佳答案
正如@Bedla在评论中已经暗示的那样,您可能在数据库中使用不区分大小写的varchar数据类型.但是,这不建议用于Hibernate中的主键(通常),因为Hibernate在引用持久化上下文中的实体(如果启用了二级缓存)时依赖于id属性值唯一性.
例如,在通过“USA”加载实体然后通过“usa”加载实体(或者在“USA”已经加载之后合并分离的“usa”之后),在同一个持久化上下文中,您可能最终得到两个不同的实例在持久化上下文中,意味着它们将被单独刷新,从而覆盖彼此的更改等.
而是在数据库中使用区分大小写的数据类型,但允许通过忽略大小写进行搜索:
public interface CountryRepository extends CrudRepository
PS国家/地区代码一般不适合主键,因为它们可以更改.