我有以下结构。
@MappedSuperclass
public abstract class Action {
...
}
我有以下结构:有几个实体扩展了Action,例如......。
@Entity(name="chemistry")
public class Chemistry extends Action implements Serializable {
...
}
为了执行持久化,我使用了JPARepository。
@NoRepositoryBean
public interface ActionRepository<T extends Action> extends JpaRepository<T, String> {
...
}
和一个子实体的接口。
@Component
@Service
@Repository
interface ChemistryRepository extends ActionRepository<Chemistry> {
}
所有从Action继承的实体的持久化机制都能正常工作。现在我有一个问题。我在DB中还有一个表,叫做'action_params',包括额外的键值参数,这些参数与一个特定的动作有关(例如化学)。
@Entity(name="action_params")
public class ActionParams implements Serializable {
...
}
在DB中,我不能使用外键,因为该键与特定的表无关,但任何表都继承自Action。这是好的,我想使用一个查询,以便为每个Action从表action_params中获取记录,基于它的id。
我想给Action添加一个List,将这些记录映射成一个列表。我试过使用hibernate,但任何查询都返回空值(下面的代码被添加到Action类中)。
@OneToMany
@JoinFormula(value="select p from action_params p where p.action_id = id")
@Transient
protected List<ActionParams> actionParamsList;
这是不工作的. 我也试过将ActionParamsRepository自动加载到Action中,但当然没有办法做到,我也想不出其他办法。
非常感谢您的建议
你有什么强烈的理由使用JPA关系?
如果没有这样的理由,我建议你在ActionParams仓库中实现一个新的finder方法。就像这样。
@Query("select p from action_params p where p.action_id = :actionId")
List<ActionParams> findAllByActionId(@Param("actionId") Long actionId )
我想类型是Long 如果你有其他类型,就替换它。
你可以使用 @Formula所以让我解释一下,当你把查询放在公式上时,在Hibernate中就增加了一个子查询。
@Formula("(SELECT p FROM action_params p WHERE p.action_id = id)")
private List<ActionParams> actionParamsList;