Используйте предложение Where в Hibernate и выберите несколько столбцов - PullRequest
0 голосов
/ 04 июля 2018

Я хочу использовать код для выбора столбца, используя последнюю версию Hibernate

public TerminalsModel getTerminalToken(String terminalToken) throws Exception {
        TerminalsModel terminal = null;
        try {
            session.getTransaction().begin();
            terminal = (TerminalsModel) session.get(TerminalsModel.class, terminalToken);
            session.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
            throw new Exception("Error");
        }
        return terminal;
    }

Я хочу использовать этот код для выбора только нескольких столбцов:

Criteria cr = session.createCriteria(User.class)
    .setProjection(Projections.projectionList()
      .add(Projections.property("id"), "id")
      .add(Projections.property("Name"), "Name"))
    .setResultTransformer(Transformers.aliasToBean(User.class));

Но я обнаружил, что createCriteria устарела. Какой метод Java я должен использовать?

Есть ли способ реализовать SQL-запрос с WHERE без пользовательского оператора SQL и получить в результате только один столбец? Я хочу оставить все для управления Java-кодом.

Ответы [ 2 ]

0 голосов
/ 11 июля 2018

Вы можете использовать DetachedCriteria , чтобы создать запрос вне области сеанса и затем выполнить его, используя произвольный Session. Это не считается устаревшим.

Criteria cr = DetachedCriteria.forClass(User.class)
    .setProjection(Projections.projectionList()
      .add(Projections.property("id"), "id")
      .add(Projections.property("Name"), "Name"))
    .setResultTransformer(Transformers.aliasToBean(User.class))
    .getExecutableCriteria(session);

Кроме того, вы можете взглянуть на JPA APIs для объявления безопасных типов критериев.

0 голосов
/ 06 июля 2018

Возврат только одного столбца в запросе JPA достаточно прост:

public List<Integer> getUserIdsByName(String name) {

    CriteriaBuilder builder = session.getCriteriaBuilder();
    CriteriaQuery<Integer> query = builder.createQuery( Integer.class );

    Root<User> root = query.from( User.class );
    query.select( root.get( "id" ) );
    query.where( builder.equal( root.get( "name" ) , name ) );

    return session.createQuery( query ).getResultList();
}

Мне неизвестен эквивалент ResultTransformer в вашем примере, но вы можете выбрать несколько свойств. Это может быть возвращение простого массива значений или в этом примере использование параметров конструктора для возвращаемого типа:

public List<UserIdAndName> getUserIdAndNameByName(String name) {

    CriteriaBuilder builder = session.getCriteriaBuilder();
    CriteriaQuery<UserIdAndName> query = builder.createQuery( UserIdAndName.class );

    Root<User> root = query.from( User.class );
    query.where( builder.equal( root.get( "name" ) , "9" ) );
    query.select( builder.construct( UserIdAndName.class , root.get( "tariff" ).get( "id" ) , root.get( "name" ) ) );

    return session.createQuery( query ).getResultList();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...