Hibernate JPA为没有实体ID的表建模

Hibernate JPA为没有实体ID的表建模,hibernate,jpa,Hibernate,Jpa,我正在为产品列表建立一个简单的索引系统。我有一个关键字和产品ID表,以及一个表示关键字与产品相关性的分数: CREATE TABLE item_index ( keyword varchar(50) NOT NULL, item_id int NOT NULL, score int NOT NULL, INDEX keyword_index (keyword) ); (item_id实际上是item表的外键,此处未显示。) 在SQL中,我将按如下方式查询索引: SELECT i

我正在为产品列表建立一个简单的索引系统。我有一个关键字和产品ID表,以及一个表示关键字与产品相关性的分数:

CREATE TABLE item_index (
  keyword varchar(50) NOT NULL,
  item_id int NOT NULL,
  score int NOT NULL,
  INDEX keyword_index (keyword)
);
(item_id实际上是item表的外键,此处未显示。)

在SQL中,我将按如下方式查询索引:

SELECT item_id,score FROM item_index WHERE keyword=? ORDER BY score DESC;
这为我提供了一个与关键字相关的项目ID列表,按照相关性的顺序排列

我的问题是:如何使用JPA实现这一点

我的尝试如下:

@Entity
@Table( name="item_index" )
@NamedQueries({
  @NamedQuery( name="ItemIndex.findByWord", query="SELECT i from ItemIndex i WHERE i.keyword=:keyword ORDER BY i.score DESC" ),
  @NamedQuery( name="ItemIndex.deleteAll", query="DELETE FROM ItemIndex" )
})
public class ItemIndex implements Serializable
{
  private static final long serialVersionUID = 1L;

  @Column( name = "keyword", length=50 )
  private String keyword;

  @ManyToOne( fetch = FetchType.LAZY )
  @JoinColumn( name = "item_id" )
  private Item item;

  @Column( name = "score" )
  private int score;

  /* Getters and setters not shown */
}
这种方法不起作用,因为JPA(在我的例子中是Hibernate)要求实体有一个ID字段。我不需要唯一的ID,因为查询表的唯一方法与上面的
SELECT
语句相同

注意,我不想将关键字存储在条目实体中-条目应该不知道索引系统

我可以设想涉及{item_id,score}元组的新表的解决方案,但我想知道是否可以只使用上面的一个表


谢谢你的帮助

项目索引表似乎有一个复合id,由
项目id
关键字组成。如果我理解正确,这些对在您的表中是唯一的。这表示您可以将其定义为表的主键,并将其用作实体的复合id

请查看有关复合id定义的帮助。文章也可能会有所帮助

谢谢,这篇文章很有帮助。(我不认为这个表中的行是实体,但它们就是实体!)