java – 从数据库中检索的实体与查询中的情况相同

前端之家收集整理的这篇文章主要介绍了java – 从数据库中检索的实体与查询中的情况相同前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我的数据库包含下表:

表:

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国家/地区代码一般不适合主键,因为它们可以更改.

猜你在找的Spring相关文章