【发布时间】:2019-07-18 07:21:38
【问题描述】:
我有一个带有属性“bracketID”的 java 对象。此属性不是唯一的。我需要一个查询,根据设置的谓词和不同的属性“bracketID”为我提供所有对象。
给定对象: 括号ID:1 括号ID:2 括号ID:3 括号ID:3 括号ID:3
需要的结果: 括号ID:1 括号ID:2 括号ID:3
重要的是我仍然可以设置任何谓词进行过滤。
我是新手,不知道如何解决这个问题
@Override
public List<UIJobData> getJobs( final String listType, final String filter, final String sortDirection,
final String sortHeader, final Integer pageIndex, final Integer pageSize )
{
final CriteriaBuilder criteriaBuilder = m_entityManager.getCriteriaBuilder();
final CriteriaQuery<UIJobData> criteriaQuery = criteriaBuilder.createQuery( UIJobData.class );
final Root<UIJobData> jobData = criteriaQuery.from( UIJobData.class );
final List<Predicate> predicates = new ArrayList<Predicate>();
addListTypeToPredicates( listType, criteriaBuilder, jobData, predicates );
addFilterToPredicates( filter, predicates, criteriaBuilder, jobData );
criteriaQuery.select( jobData ).where( predicates.toArray(new Predicate[predicates.size()]) );
setSortToCriteriaQuery( sortDirection, sortHeader, criteriaBuilder, criteriaQuery, jobData );
final TypedQuery<UIJobData> query = m_entityManager.createQuery( criteriaQuery );
setPagination( pageIndex, pageSize, query );
return query.getResultList();
}
private void addListTypeToPredicates( final String listType, final CriteriaBuilder criteriaBuilder, final Root<UIJobData> jobData,
final List<Predicate> predicates )
{
if( listType != null && !listType.isEmpty())
{
predicates.add( criteriaBuilder.like( jobData.get( "listType" ), listType ) );
}
}
private void addFilterToPredicates( final String filter, final List<Predicate> predicates, final CriteriaBuilder criteriaBuilder, final Root<UIJobData> jobData )
{
if( filter != null && !filter.isEmpty() )
{
final Predicate id = criteriaBuilder.like( jobData.get( "idString" ), "%" + filter + "%" );
final Predicate orderName = criteriaBuilder.like( criteriaBuilder.lower( jobData.get( "orderName" ) ), "%" + filter.toLowerCase() + "%" );
predicates.add( criteriaBuilder.or( id, orderName ) );
}
}
private void setSortToCriteriaQuery( final String sortDirection, final String sortHeader, final CriteriaBuilder criteriaBuilder,
final CriteriaQuery<UIJobData> criteriaQuery, final Root<UIJobData> jobData )
{
if( sortDirection != null && !sortDirection.isEmpty() && sortHeader != null && !sortHeader.isEmpty() )
{
switch( sortDirection )
{
case "asc":
criteriaQuery.orderBy( criteriaBuilder.asc( jobData.get( sortHeader ) ) );
break;
case "desc":
criteriaQuery.orderBy( criteriaBuilder.desc( jobData.get( sortHeader ) ) );
break;
default:
criteriaQuery.orderBy( criteriaBuilder.asc( jobData.get( sortHeader ) ) );
break;
}
}
else
{
criteriaQuery.orderBy( criteriaBuilder.asc( jobData.get( "id" ) ) );
}
}
private void setPagination( final Integer pageIndex, final Integer pageSize, final TypedQuery<UIJobData> query )
{
if( pageIndex != null && pageIndex >= 0 && pageSize != null && pageSize >= 0 )
{
query.setFirstResult( ( pageIndex ) * pageSize );
query.setMaxResults( pageSize );
}
}
给定对象包括: 括号ID:1 括号ID:2 括号ID:3 括号ID:3 括号ID:3
需要的结果包括: 括号ID:1 括号ID:2 括号ID:3
【问题讨论】:
标签: java spring-boot jpa criteria-api