Spring JPA CriteriaBuilder, где предложение для соединяемых таблиц - PullRequest
0 голосов
/ 06 декабря 2018

Как создать запрос с несколькими предложениями where для соединяемых таблиц?

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<A> cq = cb.createQuery(A.class);
Root<A> a = cq.from(A.class);
ListJoin<A, B> b = a.joinList("bs");
cq.select(a).where(cb.equal(b.get(B_.usDotNumber), 3), 
cb.equal(a.get(A_.accountNumber), 1));
List<A> as = em.createQuery(cq).getResultList();

Полученная ошибка:

java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: accountNumber of: com.foo.B [select generatedAlias0 from com.foo.A as generatedAlias0 inner join generatedAlias0.bs as generatedAlias0 where ( generatedAlias0.accountNumber=1 ) and ( generatedAlias0.usDotNumber=3 )]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:133)

...

Генерированоquery:

select generatedAlias0 from com.foo.A as generatedAlias0 inner join generatedAlias0.bs as generatedAlias0 where ( generatedAlias0.accountNumber=1 ) and ( generatedAlias0.usDotNumber=3 );

Почему «generateAlias0» используется для обеих таблиц, и как мне это исправить?Запрос должен быть:

select generatedAlias0 from com.foo.A as generatedAlias0 inner join generatedAlias0.bs as generatedAlias1 where ( generatedAlias0.accountNumber=1 ) and ( generatedAlias1.usDotNumber=3 );

Редактировать: добавить отношение сущности согласно запросу.Убраны все посторонние вещи.

@Entity
public class A {
    @Column(name = "FOO")
    private String accountNumber;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "anId", referencedColumnName = "anotherId", updatable = false)
    @LazyCollection(LazyCollectionOption.FALSE)
    private final List<B> bs = Collections.synchronizedList(new ArrayList<>());
}

@Entity
public class B {
    @Column(name = "BAR")
    private Integer usDotNumber;
}

Большое спасибо!

1 Ответ

0 голосов
/ 07 декабря 2018

Этот запрос работал после удаления выбора (а).Нет, я не понимаю, но, может быть, это поможет кому-то еще.

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<A> cq = cb.createQuery(A.class);
Root<A> a = cq.from(A.class);
ListJoin<A, B> b = a.joinList("bs");
cq.where(cb.equal(b.get(B_.usDotNumber), 3), cb.equal(a.get(A_.accountNumber), 1));
List<A> as = em.createQuery(cq).getResultList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...