- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如何在 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 对象 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>
查询中的语法。这些参数将被替换为我们通过 @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 注入(inject)警告应该注意的是,这打开了我们 Sql Injection
因为值直接插入到查询中。 (与查询中的 :arg
语法和使用准备好的语句并防止 sql 注入(inject)的 @Bind
注释相反)。至少您应该清理将用于 @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);
}
}
关于java - JDBI SQL 对象查询中的动态顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16790529/
我希望 JDBI 将自动生成的主键(Long 值)转换为另一个类。 我的 DAO: @RegisterMapper(SystemIdMapper.class) public interface Sys
这两个功能是否都经过 sanitizer /安全以防止 SQL 注入(inject)?例如,考虑以下情况: @SqlUpdate("INSERT INTO () VALUES ()") pu
您如何将 dropwizard jdbi 2.78 升级到 jdbi 版本 3,因为我想使用其中包含的连接功能。 最佳答案 项目成员在这里。 我们将在 v3 最终版本之前发布更完整的迁移指南。与此同时
当我尝试执行下面的代码时, 我收到 UnableToCreateStatementException 异常,原因如下: java.sql.SQLException:参数索引超出范围(11 > 参数数量
我正在使用 dropwizard,我想构建一个在实体中具有各种外键关系的 REST 应用程序。 例如,给出以下 3 个表: -- table persons CREATE TABLE PUBLIC.P
我使用 jdbi inTransaction() 函数将 SQL 查询作为事务执行。我想知道内部如何/使用什么类型的锁定机制。另外,事务期间是锁定整个表还是只锁定需要更新的记录? 最佳答案 事务纯粹在
final MyDAO dao = database.onDemand(MyDAO.class); dao 实例可以重用吗?或者我们是否需要在每次使用时实例化它? 从代码来看,它似乎负责维护数据库事务
我在将JDBI仅插入列表中的第一项时遇到问题 data class UserResourceRow( val userId: UserId, val roleId: R
我收到没有可用于 com.google.common.base.Optional 的容器构建器错误。 这是更完整的堆栈跟踪: java.lang.IllegalStateException: No c
我有一个 POJO,其中包含一个内部(非静态)类,因为它共享父级 id public Long getId() { return Parent.this.getId(); } 现在我尝试在 JD
我正在使用 JDBI 通过流迭代结果集。目前,当结果中存在同名列时,mapToMap 会导致问题。我需要的只是没有列名称的值。 有没有办法将结果映射到对象列表/数组?该文档没有这方面的示例。我想要类似
我有以下类(class): public class User { private int id; private String name; private List comm
选择 JPA 和 Spring-Data 的替代方案,我想尝试使用 JDBI 使用 SQLite 实现我的存储库 存储库代码 /** * SQLite implementation of Foo
我想将查询命令放入 sql 文件中,然后使用 createStatement 从文件中读取查询并进行绑定(bind)。 执行 h.createStatement("SOME LONG QUERY AN
我正在尝试使用这样的方法在我的类中创建一个表某物: void createTab() { DBI dbi = new DBI(DBURL, DBUSER, DBPASS); BindExamples
我正在使用 JDBI 将一些数据插入到带有自动递增主键的 mysql 表中。我使用索引来进行插入。代码如下所示: public void insertWorkout(String[] values)
我正在评估 JDBI 作为 Spring JDBC 和 MyBatis 的可能替代品,但遇到了一些问题。我在 Spring Boot 1.2.5 和 Spring 4 中使用 JDBI。 我得到以下堆
我之前曾将 JDBI 用于 Java 持久性方面,但它始终是流畅的 API 而不是对象 API。立即试用对象 API。 我有一个非常简单的 DAO 对象: public interface Perso
1) 是否可以为 Dropwizard 的 JDBI mysql 连接器设置 queryTimout 的 global 值?默认值是多少?我不想在每个 DAO 中都使用@QueryTimeOut。 2
我有一个 Java 应用程序,它使用 JDBI 作为我的数据库代码。我有许多 DAO,它们大致使用以下结构进行查询: return handle.createQuery(sql)
我是一名优秀的程序员,十分优秀!