Критерии HIbernate с двумя таблицами и коллекцией - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть две таблицы,

Table Customer
ID  |  CustomerNumber  |  Name  |  City  |  PhoneNumber

Table Accounts
ID  |  CustomerNumber  |  AccountNumber  |  Bank

Отношение между двумя таблицами: CustomerNumber

Отображение моего клиента

public class Customer {
    @Id
    @Column(name = "ID")
    private Integer ID;
    @Column(name = "CustomerNumber")
    private Integer customerNumber;
    @Column(name = "Name")
    private String name;
    @Column(name = "City")
    private String city;
    @Column(name = "PhoneNumber")
    private Integer phoneNumber;
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "customerNumber")
    private Collection<Account> accounts;
}

И сопоставление учетной записи

public class Account {
    @Id
    @Column(name = "ID")
    private Integer ID;
    @JoinColumn(name = "CustomerNumber", referencedColumnName="CustomerNumber")
    @ManyToOne(fetch = FetchType.LAZY)
    private Customer customer;
    @Column(name = "AccountNumber")
    private Integer accountNumber;
    @Column(name = "Bank")
    private String bank;
}

Функция i DAO

public SearchResult listByCriteria(Customer object, int maxResults, String sortProperty, boolean ascending) {
    SearcResult result = new SearchResult();
    int resultSize = 0;
    Criteria customerCriteria = ((Session)em.getDelegate()).createCriteria(Customer.class);
    if(maxResults > 0) {
        customerCriteria.setMaxResults(maxResults);
    }
    try {
        if(object != null) {
            customerCriteria = QueryHelper.getCustomerCriteria(object, customerCriteria, "");
            resultSize = QueryHelperUtil.countResults(customerCriteria);
            result.setSize(resultSize);
            customerCriteria.setFirstResult(index);
            QueryHelperUtil.sortResults(customerCriteria, sortProperty, ascending);
            result.setList(customerCriteria.list());
        }
    } catch (Exception ex) {
        error(ex);
    }
    return result;
}

QueryHelper.getCustomerCriteria

public static Criteria getCustomerCriteria(Customer object, Criteria criteria, String alias) {
    if (object != null) {
        if (object.getCustomerNumber() != null && object.getCustomerNumber() > 0) {
        criteria.add(Restrictions.eq(alias+"customerNumber", object.getCustomerID()));
        }
        if (!StringUtil.isNullOrEmpty(object.getName())) {
        criteria.add(Restrictions.like(alias+"name", QueryHelperUtil.createLikeStatement(object.getName())));
        }
        if (!StringUtil.isNullOrEmpty(object.getCity())) {
        criteria.add(Restrictions.like(alias+"city", QueryHelperUtil.createLikeStatement(object.getCity())));
        }
        if (object.getPhoneNumber())) {
        criteria.add(Restrictions.eq(alias+"phoneNumber", object.getPhoneNumber()));
        }
    }
}

Теперь я хочу искать клиентов только с банковскими счетами. И я хочу настроить критерии в Hibernate. Но я просто не знаю, как это сделать?

При поиске вы можете ввести customerNumber, имя клиента, номер телефона и / или город и выбрать, сколько результатов вы хотите отобразить.

Сначала я подумал, что могу написать именованный запрос, но затем у вас есть номер результата поиска и функция сортировки результата по различным столбцам.

У меня есть поиск здесь и я посмотрел на разные похожие вопросы, но я просто не могу заставить его работать. Я пытался добавить критерии для учетной записи в функцию для перечисления клиентов по критериям, но она просто не работает, и я не знаю, связано ли это с учетной записью, являющейся коллекцией?

Может ли кто-нибудь помочь мне, пожалуйста?

Решение

Я добавил следующее в свой список критериев

customerCritera.setFetchMode("accounts",FetchMode.JOIN);
Criteria accountCriteria = customerCriteria.createAlias("accounts","accounts");

Между if (Object! = Null) и resultSize = QueryHelperUtil.countResults (customerCriteria);

1 Ответ

0 голосов
/ 12 сентября 2018

Я точно не знаю, как вы определяете, на каком счете находится банковский счет. Тем не менее, вы, вероятно, хотели бы иметь что-то вроде этого:

   Criteria criteria = getCurrentSession().createCriteria(Customer.class,"cust");
   criteria.createAlias("cust.accounts","acc");
   criteria.list();

Чтобы проверить, есть ли на счете номер банка, добавьте:

.add(Restrictions.isNotNull("acc.bank"));

перед .list ()

...