我想使用代码使用最新的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代码进行管理。
答案 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来声明类型安全的条件查询。