我在Dropwizard中使用JDBI,但在流畅的查询方面遇到了问题。我有一个apiendpoint,如下所示:
public Response getAccount(@QueryParam("nickname") String nickname, @QueryParam("email") String email);
我试图避免编写以下3个查询:
@SqlQuery( " SELECT * FROM ACCOUNT WHERE EMAIL = :email " )
public Account getAccountByEmail(@Bind("email") String email);
@SqlQuery( " SELECT * FROM ACCOUNT WHERE NICKNAME = :nickname " )
public Account getAccountByNickname(@Bind("nickname") String nickname);
@SqlQuery( " SELECT * FROM ACCOUNT WHERE NICKNAME = :nickname AND EMAIL = :email " )
public Account getAccount(@Bind("nickname") String nickname, @Bind("email") String email);
这也意味着,我的方法get帐户实现有3个如果检查…昵称和没有电子邮件,电子邮件和没有昵称,电子邮件和昵称,以确定要运行3个查询中的哪一个。如果我要添加另一个查找参数(例如,帐户ID),这意味着我现在需要6个查询(每种可能性1个)和6个if语句来确定要运行哪个查询。
有没有一种简单的方法可以用JDBI解决这个问题?我已经研究了@Define的可能性,但这存在SQL注入的风险。电子邮件和昵称都是字符串。
理想情况下,我只需要一个查询:
@SqlQuery( " SELECT * FROM ACCOUNT WHERE NICKNAME = :nickname AND EMAIL = :email " )
public Account getAccount(@Bind("nickname") String nickname, @Bind("email") String email);
如果昵称为空,它将忽略昵称要求,只需查询电子邮件。这样的事情可能吗?
编辑/更新:
我现在这样做是为了稍微清理一下我的代码:
@SqlQuery(" SELECT * FROM ACCOUNT WHERE <query> ")
public Account getAccount(@Bind("id") Long id, @Bind("nickname") String nickname, @Bind("email") String email, @Define("query") String query);
我已经更新了我的JDBI道以使用@定义。通过这样做,我可以将我的6个查询(每个案例1个查询,因为有3个查询字段)和6个if语句减少到1个查询和3个if语句。
Account account = null;
StringBuilder query = new StringBuilder();
if(accountId != null) {
query.append(" ID = :id ");
}
if(!Strings.isNullOrEmpty(nickname)) {
if(query.length() > 0) query.append(" AND ");
query.append(" NICKNAME = :nickname ");
}
else if(!Strings.isNullOrEmpty(email)) {
if(query.length() > 0) query.append(" AND ");
query.append(" EMAIL = :email ");
}
account = accountDAO.getAccount(accountId, nickname, email, query.toString());
我宁愿不使用定义,因为我想将我的查询逻辑保留在DAO中。如果这样的事情是可能的,那就太好了:
SELECT * FROM ACCOUNT WHERE @IfNotNull(id = :id)
AND @IfNotNull(email = :email) AND @IfNotNull(nickname = :nickname)
我们也可以在单个查询中实现这一点,而不是用java代码构造sql。虽然有点古怪。
select * from account where
( COALESCE(:email, NULL) IS NULL OR email = :email) and
( COALESCE(:nickname, NULL) IS NULL OR nickname = :nickname) ;
我在这里做错了什么?
我有3张桌子,LastName,MiddleName和FirstName。。。FirstName以MiddleNameID作为父项,MiddleName具有LastName。作为父项的id 模型看起来像这样 我想要这样的查询,比如给我所有的名字记录,其中lastname==Smith和/或middle==James。。。不确定如何使用Fluent DSL进行多重连接?或者给我所有与中间名和/或姓氏
问题内容: 如何在jDBI中执行类似的操作? 表: foo(id int,name varchar) 与myBatis中的@SelectProvider相似。 问题答案: 这应该工作: 不要忘记用以下方法注释包含此方法的类: 注解(因为JDBI底层使用Apache StringTemplate进行此类替换)。还要注意,使用此注释,您不能在SQL查询中使用’<’字符而不进行转义(因为它是String
JDBI查询需要支持为查询中的多个列设置值或null。 但是,下面是插入空字符串和零,而不是空值: 此外,当我记录来自同一个数据库并使用以下行映射器时,这会导致零(对于双精度,尽管字符串似乎映射为null OK):
问题内容: 如何在JDBI中使用SQL对象查询进行排序? 我想做类似的事情: 要么 问题答案: 我最近一直在探索与JDBI捆绑在一起的DropWizard,并很快遇到了同样的问题。不幸的是,JDBI的文档乏善可陈(JavaDoc和它的git存储库中的一些示例单元测试并没有单独解决),这令人失望。 这是我根据示例DAO在JDBI的Sql Object API中实现动态排序的结果: @ UseStri
我在我的活动中实现了一个视图寻呼机,在滚动时,将一组数据加载到适配器并将它们显示在列表视图中。一切正常,但我似乎无法找出如何使其更有效,因为滚动时,视图会冻结,但例如在GMAIL应用程序中,当在电子邮件之间滚动时,滚动是如此平滑。 下面是我正在使用的代码: 活动: 创建时 页面适配器: PagechAngelistener: