在Spring Data JPA接口上考虑以下方法:
@Query("select distinct :columnName from Item i")
List<Item> findByName(@Param("columnName") String columnName);
我想使用这样的方法在同一个实体上使用不同的列名动态执行查询。怎么办呢?
答案 0 :(得分:1)
你不能。您必须实施此类方法by yourself。并且您无法使用参数:您必须使用字符串连接或标准API。您传递的内容不会是列名,而是字段/属性名称。并且它不会返回List<Item>
,因为您只选择一个字段。
答案 1 :(得分:1)
您可以使用Spring Data内置的QueryDSL支持。请参阅this tutorial开始使用。
答案 2 :(得分:0)
首先,您必须添加interface:
implement custom Spring Data repositorypublic interface ItemCustomRepository {
List<Item> findBy(String columnName, String columnValue);
}
然后,您必须使用新创建的,即:。
扩展当前的Spring Data存储库接口public interface ItemRepository extends JpaRepository<Item, Long>, ItemCustomRepository, QueryDslPredicateExecutor {
}
然后你必须使用Query DSL dynamic expression feature实现你的接口(名称ItemRepositoryImpl是至关重要的 - 它将允许你使用原始的Spring Data存储库实现):
public class ItemRepositoryImpl implements ItemCustomRepository {
@Autowired
private ItemRepository itemRepository;
public List<Item> findBy(final String columnName, final String columnValue) {
Path<Item> item = Expressions.path(Item.class, "item");
Path<String> itemColumnName = Expressions.path(String.class, item, columnName);
Expression<String> itemValueExpression = Expressions.constant(columnValue);
BooleanExpression fieldEqualsExpression = Expressions.predicate(Ops.EQ, itemColumnName, itemValueExpression);
return itemRepository.findAll(fieldEqualsExpression);
}
}