Выполнение запросов к @ManyToMany с несопоставленным @JoinTable с помощью hibernate в приложении spring-mvc - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть две сущности.(Find code below)

Я пытаюсь написать запрос, который бы подсчитывал customDetails=:myCriteria из EntitiesA, связанных с EntityB определенных id.

Я написал необходимыезапрос с использованием session.CreateSQLQuery, который читает таблицу associated_entitites, однако я не могу использовать его, поскольку столбец customDetails зашифрован с помощью @ColumnTransformer hibernate и возвращает BLOB.И я не могу скопировать его в HQL, поскольку associated_entities не отображается.

a

@Entity
public class entityA{


@Id
private int id;

@Column
@ColumnTransformer
private CustomDetails customDetails;

@ManyToMany(fetch = FetchType.EAGER,
        cascade = {
            CascadeType.PERSIST,
            CascadeType.MERGE
        },
        mappedBy = "entitiesA")
private List<entityB> entitiesB;

//getters and setters
}

b

@Entity
public class entityB{


@Id
private int id;

@JoinTable(name = "associated_entities",
        joinColumns = { @JoinColumn(name = "entityA_id") },
        inverseJoinColumns = { @JoinColumn(name = "entityB_id") })
private List<EntityA> entitiesA;

//getters and setters
}

Ответы [ 2 ]

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

Другое решение, которое я нашел, и оно гораздо предпочтительнее, так как логика выполняется hibernate, который, как я обнаружил, намного быстрее, состоит в использовании двух отдельных запросов и использовании where :foo in elements()

Пример кода ниже (не соответствует примеру вопроса, но идея и использование elements() должны быть понятны)

Query<Object1> q1 = currentSession.createQuery("from Object1 o where o.objectNumber= :objectNumber");
        q1.setParameter("objectNumber", objectNumber);
        Object1 obj1 = q1.getSingleResult();
        Query<Long> q2 = currentSession.createQuery("select count(id) from Object2 o where :object1param in elements(o.associatedObjects));
        q2.setParameter("object1param ", obj1);
0 голосов
/ 26 декабря 2018

Решение, которое я нашел, но не идеально, так как логика не выполняется в спящем режиме.Пришлось написать логику в DAOImpl.

Пример кода:

public Long getQuery(String criteria, String, fromdate, String todate){
    Query theQuery = currentSession.createQuery(
                    "from EntityA a "+
                    "where a.CustomDetails >= :from "+
                    "and a.CustomDetails <= :to");
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
            LocalDate From = LocalDate.parse(fromDate, formatter);
            LocalDate To = LocalDate.parse(toDate, formatter);
            theQuery.setParameter("from", From);
            theQuery.setParameter("to", To);
            Long count = (long)0;
            List<EntityA> entities= theQuery.list();
            for(EntityA EA:entities) {
                for(EntityB EB: EA.getEntityB()) {
                    if(EB.someValue().equals(criteria)) count++;
                }
            }
            return count;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...