在ofbiz找到今天生日的人:如何从Ofbiz实体中提取月和日

时间:2018-03-14 19:04:15

标签: java date ofbiz date-comparison java-date

我有兴趣使用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);

这显然不起作用,因为我们正在尝试比较字符串和日期对象。

使其工作的另一种尝试是创建一个视图实体,并将日期转换为两个整数:日和月,或者使用上面的代码将日期转换为字符串。显然,我找不到任何方法让它发挥作用。

2 个答案:

答案 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);