在Hibernate中使用Where子句,然后选择几列

时间:2018-07-04 07:20:43

标签: hibernate hibernate-mapping hibernate-criteria

我想使用代码使用最新的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 :(得分:1)

在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();
}

答案 1 :(得分:1)

您可以使用DetachedCriteria在会话范围之外创建查询,然后使用任意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); 执行查询。不建议弃用。

DRIVER=\{SQL Server\};SERVER=${host};DATABASE=${db_name};UID=${username};PWD=${password}

此外,您可以查看JPA APIs来声明类型安全的条件查询。