如何使用hibernate条件查询将两个属性连接到一个属性中

例如,有2个属性门牌号和密码,我想要一个属性作为地址,如门牌号是10,pincode是110064和组合地址属性是10,110064这是我的代码

final Criteria criteria= getDatabaseSession().createCriteria(Application.class, "application"); final ProjectionList projectionList=Projections.projectionList(); criteria.setProjection(projectionList); projectionList.add(Projections.property("address.street"), "street"); projectionList.add(Projections.property("address.postcode"), "postcode"); projectionList.add(Projections.property("address.houseNumber"), "houseNumber"); criteria.createAlias("application.applicationCase", "applicationCase", JoinType.INNER_JOIN); criteria.createAlias("applicationCase.property", "property"); criteria.createAlias("property.address", "address"); criteria.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP); return (Map) criteria.uniqueResult(); 

我想做这样的事情

  projectionList.add(Projections.property("address.street"+"address.houseNumber"+"address.postcode"),"address"); 

可以有人帮忙吗

使用HQL

您可以使用concat表达式,但它只能用于HQL

 select concat(address.street, address.houseNumber, address.postcode) as fullAddress from ... 

使用@Formula

如果要使用Criteria,可以使用@Formula 。 需要为持久性添加其他属性

 @Formula(value = "concat(f_street, f_houseNumber, f_postcode)") private String fullAddress; 

您需要指定列名(而不是属性名),因为Hibernate会将它们按原样添加到SQL中。 使用连接时不太方便 – 您需要在公式中指定由Hibernate生成的别名。

您可以参考ProjectionfullAddress

 projectionList.add(Projections.property("fullAddress"), "fullAddress"); 

我用MySQl测试了它。 对于Oracle,您可以尝试使用

 @Formula(value = "f_street || f_houseNumber || f_postcode") private String fullAddress; 

扩展Hibernate

我试图扩展Projection以将concat函数添加到Criteria 。 我测试它是最简单的情况。

 public class ConcatProjection extends SimpleProjection { private static final String CONCAT_FUNCTION_NAME = "concat"; private final String[] properties; public ConcatProjection(String... properties) { this.properties = properties; } @Override public String toSqlString(Criteria criteria, int loc, CriteriaQuery criteriaQuery) throws HibernateException { String result = getFunction(criteriaQuery).render(StringType.INSTANCE, propertiesToColumns(criteria, criteriaQuery), criteriaQuery.getFactory()); return result + " as y" + loc + '_'; } private List propertiesToColumns(Criteria criteria, CriteriaQuery criteriaQuery) { List result = new ArrayList(properties.length); for (String property : properties) { result.add(criteriaQuery.getColumn(criteria, property)); } return result; } private SQLFunction getFunction(CriteriaQuery criteriaQuery) { return criteriaQuery.getFactory().getSqlFunctionRegistry() .findSQLFunction(CONCAT_FUNCTION_NAME); } @Override public Type[] getTypes(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { return new Type[] { StringType.INSTANCE }; } } 

运用

 projectionList.add( new ConcatProjection("address.street", "address.houseNumber", "address.postcode"), "fullAddress");