#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 У меня нет. Я удалю свой ответ.