如何动态地将列添加到Spring Data JPA @Query

时间:2015-07-22 05:25:17

标签: spring-data-jpa

在Spring Data JPA接口上考虑以下方法:

@Query("select distinct :columnName from Item i")
List<Item> findByName(@Param("columnName") String columnName);

我想使用这样的方法在同一个实体上使用不同的列名动态执行查询。怎么办呢?

3 个答案:

答案 0 :(得分:1)

你不能。您必须实施此类方法by yourself。并且您无法使用参数:您必须使用字符串连接或标准API。您传递的内容不会是列名,而是字段/属性名称。并且它不会返回List<Item>,因为您只选择一个字段。

答案 1 :(得分:1)

您可以使用Spring Data内置的QueryDSL支持。请参阅this tutorial开始使用。

答案 2 :(得分:0)

首先,您必须添加interface:

implement custom Spring Data repository
public 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);
    }

}