Correct me if this is wrong.
Usually Speicification
is in a XxxSpecifications class and has static method. And they are usually used in the following 2 ways:
public class SwVecSpecifications {
// Method 1.
public static Specification<WhiteVecEntity> conditions(String groupId, String appId, String typeId) {
return (Specification<WhiteVecEntity>) (root, query, cb) -> {
Predicate p3 = cb.equal(root.get("groupId"), groupId);
Predicate p2 = cb.equal(root.get("appId"), appId);
Predicate condition = cb.and(p2,p3);
if (typeId != null && !typeId.isEmpty()) {
Predicate p1 = cb.equal(root.get("typeId"), typeId);
condition = cb.and(condition, p1);
}
return query.select(root.get("id")).where(condition).getRestriction();
};
}
// Method 2.
static void findByConditions(EntityManager em) {
String groupId = "";
String typeId = "";
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<SuspectVecEntity> query = cb.createQuery(SuspectVecEntity.class);
Root<SuspectVecEntity> root = query.from(SuspectVecEntity.class);
Predicate p1 = cb.equal(root.get("groupId"), groupId);
Predicate p2 = cb.equal(root.get("appId"), appId);
Predicate condition = cb.and(p2,p3);
if (typeId != null && !typeId.isEmpty()) {
Predicate p1 = cb.equal(root.get("typeId"), typeId);
condition = cb.and(condition, p1);
}
CriteriaQuery<SuspectVecEntity> cq = query.select(root.get("id")).where(condition);
List<SuspectVecEntity> resultList = em.createQuery(cq).getResultList(); // resultList has Entity that only contains id
}
}
Repository for Method 1:
public interface SuspectVecRepository extends JpaRepository<SuspectVecEntity, Long>, JpaSpecificationExecutor<SuspectVecEntity> {
List<SuspectVecEntity> findAll(Specification specs);
}
Service:
@Autowired
EntityManager em;
void foo() {
// Method 1:
List<SuspectVecEntity> r1 = findAll(SwVecSpecifications.conditions());
// Method 2:
List<SuspectVecEntity> r2 = SwVecSpecifications.findByConditions(em);
}
The difference between this 2 methods is:
Method 1, DB query returns the whole column.
The reason is that repository findAll
takes a Specification
. That Specification
is returned as restriction
, and therefore, it queries all columns in Entity
. It has a select
to specify columns, which is in selection
not in restriction
. See more in class QueryStructure
.
Method 2, DB query returns only the select
columns.
It looks like return a Entity
, this is because it is a chained generic type call, and that generic type is Entity
.