我正在为产品列表构建一个简单的索引系统。我有一个关键字和产品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实际上是项目表的外键,此处未显示。)
在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实体中 - Item应该不了解索引系统。
我可以设想涉及{item_id,score}元组的新表的解决方案,但我想知道是否可以仅使用上面的一个表来完成它?
感谢您的帮助!
答案 0 :(得分:2)
item_index
表似乎有一个复合ID,由item_id
和keyword
组成。如果我理解正确,这些对在您的表中是唯一的。这表示您可以将其定义为表的主键,并将其用作实体的复合ID。
请查看JPA composite primary key以获取有关复合ID定义的帮助。 This文章也可能有所帮助。