У меня следующий случай.
У объекта A есть рекурсивный объект B, и я хочу найти объект A, если он содержит какой-либо из объектов B
public class ObjectA {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(EnumType.STRING)
@Column(name = "type", nullable = false, insertable = true, updatable
= false, length = 8)
private TypeEnum type;
@Column(name = "code", nullable = false, insertable = true, updatable
= false, length = 20)
private String code;
@OneToOne(cascade = { CascadeType.PERSIST }, fetch = FetchType.EAGER)
@JoinColumn(name = "node_id", unique = false, nullable = false)
private ObjectB node;
//GETTERS AND SETTERS
}
public class ObjectB {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(EnumType.STRING)
@Column(name = "type", nullable = false, insertable = true, updatable
= false, length = 8)
private TypeBEnum type;
@Column(name = "code", nullable = false, insertable = true, updatable
= false, length = 20)
private String code;
@OneToOne(cascade = { CascadeType.PERSIST }, fetch = FetchType.EAGER)
@JoinColumn(name = "parent_id")
private ObjectB parent;
@OneToOne(cascade = { CascadeType.PERSIST }, mappedBy = "parent")
private ObjectB children;
//GETTERS AND SETTERS
}
, поэтомуу меня есть этот объект:
ObjectA: {
type: 'MyType',
code: 'XXX',
node: {
type : 'FIRST',
code : 'First Node',
children : {
type : 'SECOND',
code : 'Second Node',
children : {
type : 'THIRD',
code : 'Third Node'
}
}
}
}
Мой репозиторий:
public interface ObjectADao
extends JpaRepository<ObjectA, Long>,
JpaSpecificationExecutor<ObjectA> {
@Query("SELECT c FROM ObjectA c "
+ "INNER JOIN ObjectB n "
+ "ON c.node.id = n.id "
+ "WHERE c.type = :type AND c.code = :code "
+ "AND c.node = :node")
Optional<ChainEntity> findBy(@Param("type") TypeEnum type,
@Param("code") String code, @Param("node") ObjectBEntity node);
}
В этом случае я могу получить свой ObjectA, если передам полный ObjectB.
Мне нужно, чтобы он был более гибким, учитывая тип и код объекта A, и один или два узла получают весь объект
Например, objectA имеет запрошенный тип и код и имеетузел, который имеет «THIRD» как тип и «Third Node» как код.
ИЛИ objectA имеет запрошенный тип и код и имеет узел, который имеет «THIRD» как тип и «Third Node»'как код и имеет узел, который имеет' SECOND 'как тип и' Second Node 'как код.
Thx