Есть ли способ заполнить не столбец члена с помощью запроса в Spring JPARepository? - PullRequest
1 голос
/ 19 апреля 2020

У меня есть следующая структура:

@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. Теперь у меня проблема. У меня есть другая таблица в БД, называемая action_params, включающая дополнительные параметры ключ-значение, которые относятся к конкретному действию c (т.е. химии). У меня есть соответствующая сущность:

@Entity(name="action_params")
public class ActionParams implements Serializable {
...
}

В БД я не могу использовать внешний ключ, поскольку ключ не связан с конкретной таблицей c, но любая таблица наследуется от Action. это нормально, я хотел бы использовать запрос, чтобы получить для каждого действия записи из таблицы action_params на основе его идентификатора.

И я хотел бы добавить Список к действию, отображая эти записи в виде списка. Я пытался использовать hibernate, но любой запрос возвращает пустой (следующий код был добавлен в класс Action):

@OneToMany
@JoinFormula(value="select p from action_params p where p.action_id = id")
@Transient
protected List<ActionParams>  actionParamsList;

Это не работает. Я также попытался автоматически связать ActionParamsRepository в Action, но, конечно, нет никакого способа сделать это, и я не мог придумать другого пути.

Ваш совет будет высоко ценится

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Вы можете использовать @ Formula , поэтому позвольте мне объяснить, когда вы помещаете запрос в формулу, в Hibernate добавляется подзапрос.

@Formula("(SELECT p FROM action_params p WHERE p.action_id = id)")
private List<ActionParams>  actionParamsList;
0 голосов
/ 19 апреля 2020

Какая веская причина, по которой вы должны использовать отношение JPA?

Если такой причины нет, я бы предложил вам внедрить новый метод поиска в репозитории ActionParams. Примерно так:

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

Полагаю, тип Long. Замените его, если у вас есть другой тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...