Я пытаюсь получить сумму с одного до многих отношениях, иллюстрируется следующим соотношением (только родитель показано):Сумма с одного до многих Spring Data JPA
@Entity
@Table(name = "Parent")
public class Parent implements Serializable {
private static final long serialVersionUID = -7348332185233715983L;
@Id
@Basic(optional = false)
@Column(name = "PARENT_ID")
private Long parentId;
@OneToMany
@JoinColumn(name="CHILDREN", referencedColumnName="PARENT_ID")
private List<Child> children;
@Formula("(select sum(select height from children))")
private BicDecimal totalHeight
}
Это не довольно прямо вперед нет ограничения и даже со статическими ограничениями. У меня возникают проблемы, когда список детей ограничен динамически.
В моем случае я использую данные весны и jpa. Я использую спецификации для ограничения детей и получаю соответствующий список детей, но, очевидно, сумма по-прежнему остается для неограниченных детей, потому что в теге @Formula нет предложения where.
Я не хочу перебирать список в java по соображениям производительности и потому, что результаты разбиты на страницы. Кроме того, сумма не состоит из разбитых на страницы результатов, но и всех результатов.
Я новичок в Spring Data/JPA. Исторически я мог бы построить этот запрос динамически или использовать критерии спящего режима. Я выполняю полный запрос на завершение, чтобы сделать этот расчет. не требуется, чтобы я использовал аннотацию @Formula, поскольку для каждого звонка есть только 1 агрегирование. В рамках hibernate я могу просто указать предложение select как «sum (field)» и построить критерии. В рамках Spring Data/JPA я могу создать спецификации, которые покрывают критерии, но я не знаю, как манипулировать выбранной частью запроса, поскольку он кажется настолько тесно привязанным к объекту.
Использование аннотации @Query в репозитории работает как собственный запрос, если я знаю, какие поля мне нужно ограничить, но часто поля имеют нулевое значение и их нужно игнорировать. Есть 8 возможных полей, оставляя мне 256 возможных комбинаций (2^8). Это слишком много методов для этого в репозитории.
Любые идеи за пределами коммутационных систем?