forked from RyanGoodwill/backend
GPT牛逼,搜索搞成了
This commit is contained in:
parent
9e03bb3873
commit
33f811e6b7
@ -1,6 +1,12 @@
|
||||
package org.cmh.backend.NewsManagement.service;
|
||||
|
||||
import jakarta.persistence.EntityManager;
|
||||
import jakarta.persistence.EntityNotFoundException;
|
||||
import jakarta.persistence.PersistenceContext;
|
||||
import jakarta.persistence.criteria.CriteriaBuilder;
|
||||
import jakarta.persistence.criteria.CriteriaQuery;
|
||||
import jakarta.persistence.criteria.Predicate;
|
||||
import jakarta.persistence.criteria.Root;
|
||||
import org.cmh.backend.NewsManagement.dto.NewsRequest;
|
||||
import org.cmh.backend.NewsManagement.dto.SearchNewsRequest;
|
||||
import org.cmh.backend.NewsManagement.model.News;
|
||||
@ -25,6 +31,9 @@ public class NewsService {
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
|
||||
@PersistenceContext
|
||||
private EntityManager entityManager;
|
||||
|
||||
public List<News> getNewsByRange(int start, int end, UserHS user) {
|
||||
if (start < 0 || end <= start) {
|
||||
throw new IllegalArgumentException("Invalid start or end range");
|
||||
@ -104,24 +113,63 @@ public class NewsService {
|
||||
public long getNewsCount() {
|
||||
return newsRepository.count();
|
||||
}
|
||||
|
||||
// TODO:完善用户权限
|
||||
// public List<News> searchNews(SearchNewsRequest request) {
|
||||
// String username = JwtUtil.extractUsername(request.getToken());
|
||||
// UserHS user = userService.getUserByUsername(username);
|
||||
// if (user.getSuperAdmin()) {
|
||||
// return newsRepository.findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContaining(
|
||||
// request.getTitle(),
|
||||
// request.getSummary(),
|
||||
// request.getAuthor(),
|
||||
// request.getImagePath()
|
||||
// );
|
||||
// }
|
||||
// return newsRepository.findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContainingAndTenantEquals(
|
||||
// request.getTitle(),
|
||||
// request.getSummary(),
|
||||
// request.getAuthor(),
|
||||
// request.getImagePath(),
|
||||
// user.getUsername()
|
||||
// );
|
||||
// }
|
||||
public List<News> searchNews(SearchNewsRequest request) {
|
||||
String username = JwtUtil.extractUsername(request.getToken());
|
||||
UserHS user = userService.getUserByUsername(username);
|
||||
|
||||
// Create a list to hold predicates
|
||||
List<Predicate> predicates = new ArrayList<>();
|
||||
// Create the query
|
||||
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
|
||||
CriteriaQuery<News> criteriaQuery = criteriaBuilder.createQuery(News.class);
|
||||
Root<News> root = criteriaQuery.from(News.class);
|
||||
|
||||
// Build the query conditionally based on non-empty fields
|
||||
if (!request.getTitle().isEmpty()) {
|
||||
predicates.add(criteriaBuilder.like(root.get("title"), "%" + request.getTitle() + "%"));
|
||||
}
|
||||
if (!request.getSummary().isEmpty()) {
|
||||
predicates.add(criteriaBuilder.like(root.get("summary"), "%" + request.getSummary() + "%"));
|
||||
}
|
||||
if (!request.getAuthor().isEmpty()) {
|
||||
predicates.add(criteriaBuilder.like(root.get("author"), "%" + request.getAuthor() + "%"));
|
||||
}
|
||||
if (!request.getImagePath().isEmpty()) {
|
||||
predicates.add(criteriaBuilder.like(root.get("imagePath"), "%" + request.getImagePath() + "%"));
|
||||
}
|
||||
|
||||
if (user.getSuperAdmin()) {
|
||||
return newsRepository.findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContaining(
|
||||
request.getTitle(),
|
||||
request.getSummary(),
|
||||
request.getAuthor(),
|
||||
request.getImagePath()
|
||||
);
|
||||
// Combine predicates with OR
|
||||
criteriaQuery.where(criteriaBuilder.or(predicates.toArray(new Predicate[0])));
|
||||
} else {
|
||||
// Combine predicates with OR and add tenant condition
|
||||
Predicate tenantPredicate = criteriaBuilder.equal(root.get("tenant"), user.getUsername());
|
||||
predicates.add(tenantPredicate);
|
||||
criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[0])));
|
||||
}
|
||||
return newsRepository.findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContainingAndTenantEquals(
|
||||
request.getTitle(),
|
||||
request.getSummary(),
|
||||
request.getAuthor(),
|
||||
request.getImagePath(),
|
||||
user.getUsername()
|
||||
);
|
||||
|
||||
// Execute the query
|
||||
return entityManager.createQuery(criteriaQuery).getResultList();
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user