Ormlite queryRaw的自动格式化日期参数

时间:2016-01-22 12:23:28

标签: java date-format ormlite

使用dao.queryRaw(String, RowMapper, String... params)时,根据字段声明中指定的格式,有一种方法可以在作为参数传递时自动格式化日期吗?

示例:

数据类声明:

public class Example {
    @DatabaseField(generatedId = true)
    int id;
    @DatabaseField(dataType = DataType.DATE_STRING, format = "yyyy/MM/dd HH:mm:ss")
    Date date;
}

查询:

String query = "select * from example where date = ?"
String[] params = { new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date()) };
return dao.queryRaw(query, dao.getRawRowMapper(), params);

有没有办法向Ormlite询问日期格式或将日期格式化为我,而不是重复(或使用相同的常量)字符串?

2 个答案:

答案 0 :(得分:1)

一种hacky解决方案:

String query = "select * from example where date = ?"

// cast dao from interface to implemenation :-(
// and get the field info from its table info
FieldType fieldType = ((BaseDaoImpl<Example, Integer>) dao).getTableInfo().getFieldTypeByColumnName("date");
// format parameter
String param = DateStringType.getSingleton().javaToSqlArg(fieldType, new Date()).toString();
String[] params = {param};
return dao.queryRaw(query, dao.getRawRowMapper(), params);

答案 1 :(得分:1)

我非常确定使用Date可以直接使用QueryBuilder。但是,如果您需要使用仅处理字符串的原始查询,则会出现问题。

List<Example> results = 
     exampleDao.queryBuilder().where().eq("date", new Date()).query();

如果您无法使用QueryBuilder,那么一个hack就是将format = "..."字符串编码为静态字符,并将dateToString(Date)添加到Example。这样的事情应该有效:

public class Example {
    private static final String DATE_FORMAT = "yyyy/MM/dd HH:mm:ss";
    @DatabaseField(generatedId = true)
    int id;
    @DatabaseField(dataType = DataType.DATE_STRING, format = DATE_FORMAT)
    Date date;
    ...
    public String dateToString(Date date) {
        // remember that SimpleDateFormat is not reentrant
        return new SimpleDateFormat(DATE_FORMAT).format(new Date());
    }
}