在 Hibernate 中使用 Where 子句和 select 几列

Use Where clause in Hibernate and select several columns

我想使用最新的 Hibernateselect 列中的代码

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;
    }

我想将此代码用于 select 只有几列:

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代码来管理。

在 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 的等价物,但你可以 select 多个属性。这可能是 return 一个简单的值数组,或者在这个例子中使用 return 类型的构造函数参数:

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

您可以使用 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 以了解类型安全条件查询的声明。