有没有办法在Spring JPARepository中使用查询来填充非列成员?

问题描述 投票:1回答:2

我有以下结构。

@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中,但当然没有办法做到,我也想不出其他办法。

非常感谢您的建议

java spring jpa
2个回答
0
投票

你有什么强烈的理由使用JPA关系?

如果没有这样的理由,我建议你在ActionParams仓库中实现一个新的finder方法。就像这样。

@Query("select p from action_params p where p.action_id = :actionId")
List<ActionParams> findAllByActionId(@Param("actionId") Long actionId )

我想类型是Long 如果你有其他类型,就替换它。


0
投票

你可以使用 @Formula所以让我解释一下,当你把查询放在公式上时,在Hibernate中就增加了一个子查询。

@Formula("(SELECT p FROM action_params p WHERE p.action_id = id)")
private List<ActionParams>  actionParamsList;
© www.soinside.com 2019 - 2024. All rights reserved.