如何使用唯一键而不是主键在 Hibernate 中检索记录

Posted

技术标签:

【中文标题】如何使用唯一键而不是主键在 Hibernate 中检索记录【英文标题】:How to retrieve record in Hibernate using Unique key instead of Primary Key 【发布时间】:2012-09-04 07:19:32 【问题描述】:

使用session.load()session.get()org.hibernate.session 的任何其他方法,是否可以根据Unique 列而不是PK 列值在hibernate 中获取记录?

我的要求是我需要根据唯一列值而不是主键来获取记录。

就像我不想使用 Criteria API。我需要使用 session.get 或 load 类型的方法。您提到的答案是进行搜索。但我要求根据唯一键获取一条记录。比如说。我的类 Fruit 有一个 PK 列 ID 和一个唯一列 fruitID,它是唯一键。我想根据fruitID 而不是ID 检索唯一记录。例如。水果fruit = (Fruit) session.get(Fruit.class,fruitID);这里fruitID是Fruit类的唯一列。

【问题讨论】:

-1 表示缺乏信息。提出问题时,请尝试发布有关您的问题的相关信息(例如,您尝试过的代码 sn-ps)。是的,您可以在 hibernate w.r.t 任何列中获取记录集合或记录。 【参考方案1】:

你的意思是这样的?

Criteria criteria = session.createCriteria(User.class);  
criteria.add( Restrictions.eqProperty("uniqueField", "value") )
List results = criteria.list();
Object myObj = results.get(0);

查看hibernate manual 了解有关条件的更多信息

【讨论】:

感谢大家的回复!!就像我不想使用 Criteria API。我需要使用 session.get 或 load 类型的方法。您提到的答案是进行搜索。但我要求根据唯一键获取一条记录。比如说。我的类 Fruit 有一个 PK 列 ID 和一个唯一列 fruitID,它是唯一键。我想根据fruitID 而不是ID 检索唯一记录。例如。水果fruit = (Fruit) session.get(Fruit.class,fruitID);这里fruitID是Fruit类的唯一列。 在休眠会话中还有其他类似 get() 的方法吗? 使用 Hibernate 的 Criteria 是执行此操作的最简单方法,而且总体而言,使用标准是最佳实践。您需要执行的所有处理中的 99% 都可以使用 Criteria 完成。 createCriteria 是 Hibernate 的 session 接口中提供的一个方法,所以我真的不明白你为什么不想使用它。 你在上面的代码中有错字:session.list();应该是criteria.list(); - 编辑它。【参考方案2】:

如果使用现有表,您可能会发现这很有帮助,您只需要查找行,可能进行简单的编辑并且您不需要主键

将@Id注解移至唯一键字段,省略主键或使其成为普通列

如果您只进行查找或编辑该表,则会出现更复杂的操作问题,但是您可以定义第二个实体来进行查找,如果您以后需要进行主键操作,请按主键重新查找键

@Entity 
class RealEntity implements Serializable 
    @Id
    private int id;

    @Column(...)
    private String uniqueSecondKey;

    ...



@Entity
class LookupEntity implements Serializable 
    @Column()
    private int id;

    @Id
    @Column(...)
    private String uniqueSecondKey;

    ...

【讨论】:

以上是关于如何使用唯一键而不是主键在 Hibernate 中检索记录的主要内容,如果未能解决你的问题,请参考以下文章

如果我使用 select2 小部件,如何发布表中记录的实际主键而不是 php Yii2 中的数组索引?

Hibernate之OID

在sqlite中插入时获取主键而不是rowID或通过其rowID获取主键

mysql使用主键而不是索引

SQL Server 2005 会因为我使用 nvarchar(50) 而不是整数作为主键而惩罚我吗?

使用主键在 DataView 中定位行