GPT牛逼,搜索搞成了

This commit is contained in:
高子兴 2024-07-05 06:20:30 +08:00
parent 9e03bb3873
commit 33f811e6b7

View File

@ -1,6 +1,12 @@
package org.cmh.backend.NewsManagement.service; package org.cmh.backend.NewsManagement.service;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityNotFoundException; 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.NewsRequest;
import org.cmh.backend.NewsManagement.dto.SearchNewsRequest; import org.cmh.backend.NewsManagement.dto.SearchNewsRequest;
import org.cmh.backend.NewsManagement.model.News; import org.cmh.backend.NewsManagement.model.News;
@ -25,6 +31,9 @@ public class NewsService {
@Autowired @Autowired
private UserService userService; private UserService userService;
@PersistenceContext
private EntityManager entityManager;
public List<News> getNewsByRange(int start, int end, UserHS user) { public List<News> getNewsByRange(int start, int end, UserHS user) {
if (start < 0 || end <= start) { if (start < 0 || end <= start) {
throw new IllegalArgumentException("Invalid start or end range"); throw new IllegalArgumentException("Invalid start or end range");
@ -104,24 +113,63 @@ public class NewsService {
public long getNewsCount() { public long getNewsCount() {
return newsRepository.count(); return newsRepository.count();
} }
// TODO:完善用户权限 // 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) { public List<News> searchNews(SearchNewsRequest request) {
String username = JwtUtil.extractUsername(request.getToken()); String username = JwtUtil.extractUsername(request.getToken());
UserHS user = userService.getUserByUsername(username); UserHS user = userService.getUserByUsername(username);
if (user.getSuperAdmin()) {
return newsRepository.findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContaining( // Create a list to hold predicates
request.getTitle(), List<Predicate> predicates = new ArrayList<>();
request.getSummary(), // Create the query
request.getAuthor(), CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
request.getImagePath() 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() + "%"));
} }
return newsRepository.findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContainingAndTenantEquals( if (!request.getSummary().isEmpty()) {
request.getTitle(), predicates.add(criteriaBuilder.like(root.get("summary"), "%" + request.getSummary() + "%"));
request.getSummary(), }
request.getAuthor(), if (!request.getAuthor().isEmpty()) {
request.getImagePath(), predicates.add(criteriaBuilder.like(root.get("author"), "%" + request.getAuthor() + "%"));
user.getUsername() }
); if (!request.getImagePath().isEmpty()) {
predicates.add(criteriaBuilder.like(root.get("imagePath"), "%" + request.getImagePath() + "%"));
}
if (user.getSuperAdmin()) {
// 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])));
}
// Execute the query
return entityManager.createQuery(criteriaQuery).getResultList();
} }
} }