Спецификация данных Spring с отношениями сущностей

#java #spring #spring-boot #hibernate #specifications

#java #spring #spring-boot #переход в спящий режим #спецификации

Вопрос:

у меня есть этот объект:

 @Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class Employee implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "EMPLOYEE_ID")
    private Long employeeId;

   @Column(name = "FK_OTHER_ENTITY")
    private Long otherEntityId;

.......

}
  

и сущность 2:

  @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    @Entity
    public class OtherEntity implements Serializable {
        private static final long serialVersionUID = 1L;
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "OTHER_ID")
        private Long otherEntityId;
    
       @Column(name = "DATE_FIRST")
        private Date dateFirst;

        @Column(name = "DATE_LAST")
        private Date dateLast;
    
    .......
    
    }
  

Я хочу создать спецификацию первого объекта, но у меня есть этот sql:

 select a.* from employee a, other entity b where a.FK_OTHER_ENTITY = b.OTHER_ID AND "DATE1 OF INPUT" >= b.DATE_FIRST and "DATE2 of INPUT" <= b.DATE_LAST
  

Как я получаю доступ к атрибуту другого объекта, который имеет простой внешний ключ, а не отношение?

Спасибо за ответ

Ответ №1:

Вы можете использовать специальные объединения из Hibernate 5.1:

Как объединить несвязанные сущности с помощью JPA и гибернации

Документы гибернации: явные объединения

Просто используйте предложение inner join or left join with on .

Вы можете использовать обычные соединения SQL, если вы собираетесь использовать SQL (не JPQL).

Комментарии:

1. Значит, я не использую спецификацию? @в. ладынев

2. @Alex Извините. Я не понял, о чем идет речь specifications . Ваше where предложение всегда одно и то же (сравнение двух дат), поэтому гораздо лучше использовать JPQL здесь.

3. @Alex если объект and имеет отношение ManyToOne, могу ли я создать выражение, например выражение<Список<EntityRelation>> Пользовательское выражение = root. <EntityRelation>>

4. @Alex У меня нет. Я удалю свой ответ.