我有兴趣使用ofbiz找到今天生日的人。
这是用户的实体:
<entity entity-name="User">
<field name="identifier" type="id-long"></field>
<field name="dateOfBirth" type="date"></field>
</entity>
这是已损坏的代码,用于搜索今天有生日的用户:
SimpleDateFormat monthDayFormat = new SimpleDateFormat("MM-dd");
Calendar cal = Calendar.getInstance();
String today = monthDayFormat.format(cal.getTime());
List<GenericValue> people = dctx.getDelegator().findList("User",
EntityCondition.makeCondition("dateOfBirth", EntityOperator.LIKE, "%".today),
null, null, null, false);
这显然不起作用,因为我们正在尝试比较字符串和日期对象。
使其工作的另一种尝试是创建一个视图实体,并将日期转换为两个整数:日和月,或者使用上面的代码将日期转换为字符串。显然,我找不到任何方法让它发挥作用。
答案 0 :(得分:4)
最有效的方法是构建视图实体。
以下定义应适用于多个数据库(例如PostgreSQL),即支持EXTRACT
功能的数据库:
<view-entity entity-name="UserView">
<member-entity entity-alias="USER" entity-name="User"/>
<alias-all entity-alias="USER"/>
<alias name="dayOfBirth" function="extract-day" entity-alias="USER" field="dateOfBirth"/>
<alias name="monthOfBirth" function="extract-month" entity-alias="USER" field="dateOfBirth"/>
</view-entity>
通过上述视图,您可以通过约束两个新字段轻松执行查询:
List<GenericValue> users = EntityQuery.use(dctx.getDelegator()).from("UserView").where("dayOfBirth", day, "monthOfBirth", month).queryList();
或者,如果您正在编写Groovy脚本,它在OFBiz DSL中的等价物:
List<GenericValue> users = from("UserView").where("dayOfBirth", day, "monthOfBirth", month).queryList();
或者,按照完全不同的方法,您可以通过添加“dayOfBirth”和“monthOfBirth”字段(类型为“numeric”)来扩展“User”实体:
<entity entity-name="User">
<field name="identifier" type="id-long"></field>
<field name="dateOfBirth" type="date"></field>
<field name="dayOfBirth" type="numeric"></field>
<field name="monthOfBirth" type="numeric"></field>
</entity>
然后,您可以定义一个eca规则来触发服务的执行,以便在每次创建用户记录时使用非null dateOfBirth字段填充这两个新字段:
<eca entity="User" operation="create-store" event="return">
<condition field-name="dateOfBirth" operator="is-not-empty"/>
<action service="populateDayAndMonthOfBirth" mode="sync"/>
</eca>
populateDayAndMonthOfBirth服务的服务定义如下:
<service name="populateDayAndMonthOfBirth">
<attribute name="identifier" type="String" mode="IN" optional="false"/>
</service>
(请填写缺少的属性,如“引擎”,“位置”和“调用”)。 该服务只需选择记录,从dateOfBirth字段中提取表示日期和月份的整数,并将它们存储在dayOfBirth和monthOfBirth字段中。
答案 1 :(得分:0)
基本上你可以结合两个条件:
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
Date tmpDate = cal.getTime();
Timestamp from = new Timestamp(tmpDate.getTime());
EntityCondition condf = EntityCondition.makeCondition("dateOfBirth",
EntityOperator.GREATER_THAN_EQUAL_TO, from);
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 999);
tmpDate = cal.getTime();
Timestamp thru = new Timestamp(tmpDate.getTime());
EntityCondition condt = EntityCondition.makeCondition("dateOfBirth",
EntityOperator.LESS_THAN_EQUAL_TO, thru);
然后找到:
List<GenericValue> people = dctx.getDelegator().findList("User",
EntityCondition.makeCondition(condf, condt), null, null, null, false);