我有一个包含数据的表,并且有一个带有日期值的列。
Table A
table_id date
因此,请将表视为拥有超过数千个行和条目。我想要做的是从表中选择所有不同的月份和年份,因此输出可能看起来像这样:
09 2013 09-2013
12 2014 12-2014
01 2015 01-2015
03 2015 03-2015
05 2015 05-2015
也许是这样的?如果可以的话?
dao.queryBuilder().distinct().selectColumns("strftime('%mm-%yyyy', date)").query();
但我似乎无法以我想要的方式完成上述工作。我的模型还使用DataType.DATE
字段上的date
。
有什么方法可以使用OrmLite的distinct()
方法返回这种列表吗?任何帮助将不胜感激!谢谢!
答案 0 :(得分:1)
CREATE TABLE TableA(table_id INT, `date` DATE);
INSERT INTO TableA
VALUES (1, '2014-01-21'), (2, '2014-01-23'),
(3, '2015-01-21'), (4, '2015-01-01'), (5, '2014-07-21'), (6, '2012-01-01');
SELECT DISTINCT
STRFTIME('%m-%Y', t.`date`) AS Output
FROM TableA t
ORDER BY t.`date`;
我不知道OrmLite
但我希望您能够转换此解决方案,或者只是将纯SQL用于您的ORM。
修改强>
SELECT DISTINCT
STRFTIME('%m', t.`date`) AS Month,
STRFTIME('%Y', t.`date`) AS `Year`,
STRFTIME('%m-%Y', t.`date`) AS Output
FROM TableA t
ORDER BY t.`date`;
答案 1 :(得分:1)
为了确保我们正在谈论同样的事情:ORMLite是一个“对象关系映射精简版(ORM Lite)提供了一些简单,轻量级的功能,用于将Java对象持久化到SQL数据库[...]。”
它不仅仅是一些SQL原始查询的包装器:它提供了一种创建模型(一些POJO)的方法,这些模型将持久存储在数据库中,而不必处理SQL约束和强大的知识。您将能够使用普通Java对象存储对象并检索它们。
selectColumns(String)
方法将列名作为参数。您正在传递原始SQL语句。
如果你阅读了这个方法的源代码,你就有了这个:
public QueryBuilder<T, ID> selectColumns(String... columns) {
for (String column : columns) {
addSelectColumnToList(column);
}
return this;
}
然后
private void addSelectColumnToList(String columnName) {
verifyColumnName(columnName);
addSelectToList(ColumnNameOrRawSql.withColumnName(columnName));
}
并完成:
/**
* Verify the columnName is valid and return its FieldType.
*
* @throws IllegalArgumentException
* if the column name is not valid.
*/
protected FieldType verifyColumnName(String columnName) {
return tableInfo.getFieldTypeByColumnName(columnName);
}
因此,通过内省,ORMLite将尝试在模型的字段中查找给定的列名称。你的字符串显然不是列名:)
此外,对于更“概念”的问题:我认为您不应该从您的请求中转换日期格式。实际上,ORMLite负责在您的数据库中保留模型。他的目的不是为了正确格式化数据以进行处理或显示。如果在数据库中保存数据后需要将其显示为另一个数据库,则必须在此时制作“解析内容”,而不是之前。
总结一下:
date
字段distinct()
<强>来源强>
http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_3.html#QueryBuilder-Capabilities