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);
// 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()) { if (user.getSuperAdmin()) {
return newsRepository.findByTitleContainingOrSummaryContainingOrAuthorContainingOrImagePathContaining( // Combine predicates with OR
request.getTitle(), criteriaQuery.where(criteriaBuilder.or(predicates.toArray(new Predicate[0])));
request.getSummary(), } else {
request.getAuthor(), // Combine predicates with OR and add tenant condition
request.getImagePath() 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(), // Execute the query
request.getSummary(), return entityManager.createQuery(criteriaQuery).getResultList();
request.getAuthor(),
request.getImagePath(),
user.getUsername()
);
} }
} }