当前位置: 首页 > 知识库问答 >
问题:

在Spring数据中为相同的QueryDSL路径创建多个别名

越季萌
2023-03-14

我有一个通用的Spring数据存储库接口,它扩展了QueryDSLBinderCustomizer,允许我自定义查询执行。我正在尝试扩展内置在默认存储库实现中的基本相等性测试,以便能够使用Spring Data REST执行其他查询操作。例如:

GET /api/persons?name=Joe%20Smith  // This works by default
GET /api/persons?nameEndsWith=Smith  // This requires custom parameter binding.
@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable>
    extends PagingAndSortingRepository<T, ID>, QueryDslPredicateExecutor<T>, QuerydslBinderCustomizer { 

    @Override
    @SuppressWarnings("unchecked")
    default void customize(QuerydslBindings bindings, EntityPath entityPath){

        Class<T> model = entityPath.getType();
        Path<T> root = entityPath.getRoot();
        for (Field field: model.getDeclaredFields()){
            if (field.isSynthetic()) continue;
            Class<?> fieldType = field.getType();
            if (fieldType.isAssignableFrom(String.class)){
                // This binding works by itself, but not after the next one is added
                bindings.bind(Expressions.stringPath(root, field.getName()))
                        .as(field.getName()  + "EndsWith")
                        .first((path, value) -> {
                            return path.endsWith(value);
                        });
                // This binding overrides the previous one
                bindings.bind(Expressions.stringPath(root, field.getName()))
                        .as(field.getName()  + "StartsWith")
                        .first((path, value) -> {
                            return path.startsWith(value);
                        });
            }
        }
    }
}

共有1个答案

马冯浩
2023-03-14

您可以通过以下方式创建绑定到QueryDSL的瞬态属性:

@Transient
@QueryType(PropertyType.SIMPLE)
public String getNameEndsWith() {
    // Whatever code, even return null
}

如果您正在使用QueryDSL注释处理器,您将在元数据Qxxx类中看到“NameEndsWith”,因此您可以像绑定任何持久化属性一样绑定它,但不需要持久化它。

 类似资料:
  • 问题内容: 我有一个使用在不同地理位置的四个数据库的应用程序。所有数据库都包含相同的表,只有数据库名称根据位置而不同。我必须在应用程序中创建一些报告,这些报告使用每个数据库中的数据。从Java应用程序创建那些数据库连接的正确方法是什么,是否有适合我使用的适合此任务的设计模式? 问题答案: 由于您没有任何的标记这个你的问题,,,,我假设你正在处理普通的JDBC。 话虽如此,我建议您有一个DAO层来处

  • 然而,在我的例子中,就字体文件而言,输入过程有点抽象,我只知道输出。在我的其他文件正在进行转换的情况下,有一个已知的点,我要求它们由我的加载器处理。如果有一种方法可以找出这一步发生的位置,那么我可以使用哈希方法自定义输出路径,但我不知道这些文件需要在哪里。

  • 问题内容: 我正在使用Spring Boot。我终于设法设置了两个数据源,但是现在我面临另一个问题。 有两个数据源的地方似乎无法在我的Spring Boot应用程序中工作,请立即执行此操作 我无法为每个数据源选择自动创建策略。我宁愿为数据源一创建模式,而仅在第二个DB中使用数据源为二的模式。 任何机构都知道如何解决这些问题?注意如果可能的话,我不想完全放弃自动配置。我什至还不知道,hibernat

  • 我想比较同一个工作区文件夹中的两个路径,并获得它们之间的相对路径: 并从secondPath返回firstPath相对路径 谢谢你的帮助。

  • 我有一个问题,从多个路径从Firebas eDatabase获取数据。我正在编写一个Endomondo克隆,我有一个数据库结构如下: 现在我想在feed选项卡中列出我朋友的所有锻炼。所以要做到这一点,我需要做三件事。 1)遍历我的配置文件(user_1)以获取我所有朋友的ID。 2)当我拥有这些ID时,我需要迭代它们的配置文件以获得它们的名称来显示。 3)遍历锻炼以获得我朋友的所有锻炼。 现在我想

  • 问题内容: 我正在尝试使用单独的路线,但在我的React App中添加/编辑表单的组件相同,如下所示: 现在,在manageClient组件中,我解析查询参数(我在编辑路由中传递带有客户端ID的查询字符串),并根据传递的查询参数有条件地进行渲染。 问题在于这不会再次重新安装整个组件。假设打开了一个编辑页面,并且用户单击添加组件,URL发生了更改,但是该组件没有重新加载,因此保留在编辑页面上。 有办