製品リスト用の単純な索引付けシステムを構築しています。キーワードと製品 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 フィールドが必要なため、このアプローチは機能しません。テーブルがクエリされる唯一の方法はSELECT
上記のステートメントのとおりであるため、一意の ID は必要ありません。
Item エンティティにキーワードを保存したくないことに注意してください。Item は、インデックス作成システムの知識を持たない必要があります。
{item_id,score} タプルの新しいテーブルを含むソリューションを想定できますが、上記の 1 つのテーブルだけを使用してそれを行うことが可能でしょうか?
助けてくれてありがとう!