有没有办法在Spring JPARepository中使用查询来填充非列成员?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法在Spring JPARepository中使用查询来填充非列成员?相关的知识,希望对你有一定的参考价值。
我有以下结构。
@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;
以上是关于有没有办法在Spring JPARepository中使用查询来填充非列成员?的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot动态查询 Specification使用
有没有办法在 Spring Boot 应用程序配置中使用 Spring Cloud cipher?
有没有办法根据 Spring 配置文件禁用 Testcontainers?
除了在 Spring Boot 应用程序的 bootstrap.properties 中指定之外,有没有办法为 Slueth 提供 Spring 应用程序名称?