有没有办法在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)的审计表?

有没有办法在 Spring XML 中指定默认属性值?

有没有办法根据 Spring 配置文件禁用 Testcontainers?

除了在 Spring Boot 应用程序的 bootstrap.properties 中指定之外,有没有办法为 Slueth 提供 Spring 应用程序名称?