当前位置: 首页 > 面试题库 >

JDBI SQL对象查询中的动态顺序

彭开畅
2023-03-14
问题内容

如何在JDBI中使用SQL对象查询进行排序?

我想做类似的事情:

@SqlQuery(
    "SELECT * FROM users " +
    "WHERE something = :something " +
    "ORDER BY :orderBy :orderDir"
)
List<User> getUsers(
    @Bind("something") Integer something
  , @BindOrderBy("orderBy") String orderBy
  , @BindOrderDir("orderDir") String orderDir
);

要么

@SqlQuery(
    "SELECT * FROM users " +
    "WHERE something = :something " +
    "ORDER BY :orderBy :orderDir"
)
List<User> getUsers(
    @Bind("something") Integer something
  , @Bind("orderBy") OrderBy orderBy
  , @Bind("orderDir") OrderDir orderDir
);

问题答案:

我最近一直在探索与JDBI捆绑在一起的DropWizard,并很快遇到了同样的问题。不幸的是,JDBI的文档乏善可陈(JavaDoc和它的git存储库中的一些示例单元测试并没有单独解决),这令人失望。

这是我根据示例DAO在JDBI的Sql Object API中实现动态排序的结果:

@UseStringTemplate3StatementLocator
public interface ProductsDao {

    @RegisterMapperFactory(BeanMapperFactory.class) // will map the result of the query to a list of Product POJOs(Beans)
    @SqlQuery("select * from products order by <orderby> <order> limit :limit offset :offset")
    List<Product> getProducts(@Define("orderby") String orderBy, @Define("order") String order,
                                     @Bind("limit") int limit, @Bind("offset") int offset);

    @SqlQuery("select count(*) from products")
    int getProductsCount();

}

@ UseStringTemplate3StatementLocator-
此注释使我们可以<arg>在查询中使用语法。这些args将被我们通过@Define注释提供的任何值替换。

为了能够使用此功能,我还必须将此依赖项添加到我的pom.xml文件中:

<dependency>
  <groupId>antlr</groupId>
  <artifactId>stringtemplate</artifactId>
  <version>2.3b6</version> <!-- I am not sure if this specific version is meant to be used though -->
</dependency>

SQL注入警告 应该注意的是,Sql Injection由于将值直接插入到查询中,因此可以为我们打开大门。(:arg@Bind使用准备好的语句并防止sql注入的查询和注释中的语法相反)。至少您应该清理将用于@Define字段的参数。(下面是DropWizard的简单示例)。

@Path("/products")
@Produces(MediaType.APPLICATION_JSON)
public class ProductsResource {
  private static ImmutableSet<String> orderByChoices = ImmutableSet.of("id", "name", "price", "manufactureDate");

  private final ProductsDao dao;

  public ProductsResource(ProductsDao dao) {
    this.dao = dao;
  }

  @GET
  // Use @InjectParam to bind many query parameters to a POJO(Bean) instead. 
  // https://jersey.java.net/apidocs/1.17/jersey/com/sun/jersey/api/core/InjectParam.html
  // i.e. public List<Product> index(@InjectParam ProductsRequest request)
  // Also use custom Java types for consuming request parameters. This allows to move such validation/sanitization logic outside the 'index' method.
  // https://jersey.java.net/documentation/1.17/jax-rs.html#d4e260 
  public List<Product> index(@DefaultValue("id")  @QueryParam("orderby") String orderBy,
                             @DefaultValue("asc") @QueryParam("order")   String order,
                             @DefaultValue("20")  @QueryParam("perpage") IntParam perpage,
                             @DefaultValue("0")   @QueryParam("page")    IntParam page)

   int limit, offset;

   order = order.toLowerCase(); 
   orderBy = orderBy.toLowerCase();

   if (!orderByChoices.contains(orderBy)) orderBy = "id"; //sanitize <orderby>
   if (order != "asc" && order != "desc") order = "asc";  //sanitize <order>

   limit = perpage.get();
   offset = page.get() < 0 ? 0 : page.get() * limit;

   return dao.getProducts(orderBy, order, limit, offset);

  }
}


 类似资料:
  • 所讨论的查询是: 但是,mongoose调试的输出是: 唯一的更改是将字段从对象的最后一个位置移到第一个位置。这意味着查询不返回结果。 对这个问题有什么解决办法吗?

  • 我有一个这样的SQL问题 根据用户输入,我想将botcode='r1'更改为给定输入。在不重新启动作业的情况下说出botcode='r10'。有没有办法做到这一点。我在flink 1.7上使用stream env。我尝试配置流来读取输入。但仍停留在如何动态更改查询上。有人能帮我吗?提前谢谢

  • 是否可以从数据库中获取一个查询,该查询将从给定的变量(即将其发送到HTML,如下所示: 假设查询返回3个对象。这意味着该表将有3行数据,但所有的

  • 我试图从动态表中选择对象,但当我运行我的代码时,我得到了一些错误...有一种方法可以做到这一点...我用的是JPAHibernate和后遗症 这里是错误。。。 org.springframework.dao.InvalidDataAccessResourceUsageExc0019,"dedegMessage":"org.springframework.dao.InvalidDataAccessR

  • 问题内容: 假设我将与关联的表存储如下(代表事件的时间戳): 这样我们可以说: 用户1具有ADBCB的事件序列 用户2具有事件序列BBAAC 我想针对这些用户回答的问题类型非常容易表达为事件序列的常规表达式,例如“哪些用户的事件序列与A. * B匹配?” 或“哪些用户的事件序列与A [^ C] * B [^ C] * D匹配?” 等等。 在此表结构上可以用来回答类似查询的SQL技巧或运算符是什么?

  • 问题内容: 我正在寻找一种使用Spring Data JPA动态构建查询的解决方案。我有一个GameController,它有一个RESTful服务终结点/ games,它带有4个可选参数:体裁,平台,年份,标题。可能不传递任何API,而是传递所有4种,以及之间的每种组合。如果未传递任何参数,则默认为null。我需要在存储库中使用一种方法来构建适当的查询,并且理想情况下还允许Spring Data