在 jpa 查询中读取索引中的数组
Read Array at index in jpa Query
我有一个 return 对象列表的本机查询,我需要将数组作为参数传递给函数 getAllUsers
。
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
@Query(nativeQuery = true, value = "SELECT id FROM users WHERE code1=(?1)[0] AND code2=(?1)[1]")
public List<Object[]> getAllUsers(List<String> list);
}
问题是我无法在查询中获取参数 list
的值:code1=(?1)[0] AND code2=(?1)[1]
.
我尝试使用类型:
public List<Object[]> getAllUsers(String[] list);
public List<Object[]> getAllUsers(String ...list);
却始终没有结果
非常感谢任何帮助
我不确定 @Query
是执行动态查询的正确方法。您应该考虑 CriteriaAPI 的使用。您可以尝试使用 Specification
或 QueryDsl
https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl
通过规范解决您的问题的示例:
@Repository
public interface UserRepository
extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> {
}
@Service
@RequiredAllArgConstuctor
public class UserService {
private final UserRepository userRepository;
public List<User> getAllUsers(List<String> codeArguments) {
var specification = (Specification<T>) (root, query, criteriaBuilder) -> {
var predicates = new Predicate[codeArguments.size()];
for (int i = 0; i < codeArguments.size(); i++) {
var predicate = criteriaBuilder.equal(root.get("code" + (i + 1)), codeArguments.get(i));
predicates[i] = (predicate);
}
return criteriaBuilder.and(predicates);
};
return userRepository.findAll(specification);
}
}
我有一个 return 对象列表的本机查询,我需要将数组作为参数传递给函数 getAllUsers
。
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
@Query(nativeQuery = true, value = "SELECT id FROM users WHERE code1=(?1)[0] AND code2=(?1)[1]")
public List<Object[]> getAllUsers(List<String> list);
}
问题是我无法在查询中获取参数 list
的值:code1=(?1)[0] AND code2=(?1)[1]
.
我尝试使用类型:
public List<Object[]> getAllUsers(String[] list);
public List<Object[]> getAllUsers(String ...list);
却始终没有结果
非常感谢任何帮助
我不确定 @Query
是执行动态查询的正确方法。您应该考虑 CriteriaAPI 的使用。您可以尝试使用 Specification
或 QueryDsl
https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl
通过规范解决您的问题的示例:
@Repository
public interface UserRepository
extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> {
}
@Service
@RequiredAllArgConstuctor
public class UserService {
private final UserRepository userRepository;
public List<User> getAllUsers(List<String> codeArguments) {
var specification = (Specification<T>) (root, query, criteriaBuilder) -> {
var predicates = new Predicate[codeArguments.size()];
for (int i = 0; i < codeArguments.size(); i++) {
var predicate = criteriaBuilder.equal(root.get("code" + (i + 1)), codeArguments.get(i));
predicates[i] = (predicate);
}
return criteriaBuilder.and(predicates);
};
return userRepository.findAll(specification);
}
}