假设我想要一个JasperReport,让用户可以根据需要过滤日期.SQL如下:
select * from foo where bar = $P{bar} and some_date > $P{some.date}
Run Code Online (Sandbox Code Playgroud)
现在,如果他们没有通过日期,我不想按某个日期过滤.我发现以下人们使用的kludge:
select * from foo where bar = $P{bar} $P!{some.date.fragment}
Run Code Online (Sandbox Code Playgroud)
并且some.date.fragment参数使用以下默认值定义:
($P{some.date} == null || $P{some.date}.equals("")) ? "" : "AND some_date >'" + new java.sql.Date($P{some.date}.getTime()).toString() + "'"
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为toString不以我的SQL服务器理解的格式输出日期.我想条件仍然使用jdbc驱动程序的预准备语句并输入参数,我只是希望准备好的语句依赖于参数是否为null.可以这样做吗?
考虑一个有多个课程注册请求的系统.我们需要一种方法来阻止系统中的重复注册.我创建了一个触发器,如下所示,但是当我同时从不同的连接获得两个请求(相隔ms)时,它们都被插入.我究竟做错了什么
create trigger enrollment_duplicates
before insert
on enrollment
for each row
begin
select count(*)
into cnt
from enrollment
where user = :new.user
and course = :new.course
and status = 'Enrolled';
if cnt > 0 then
raise_application_error(-20001, 'User already enrolled in course');
end if;
end;
Run Code Online (Sandbox Code Playgroud)
编辑:
如果我们使用户/课程成为一个独特的约束,这很容易,但事实并非如此.他们可以根据状态重新注册.
假设我使用的rendered基本上是一个案例陈述.我有一个输入字段的标签和消息,但我希望字段本身根据具体情况而改变.因此:
<p:inputText id="foo" value="#{myBean.params[paramKey]}"
rendered="#{paramIsInput}" />
<p:calendar id="foo" value="#{myBean.params[paramKey]}"
rendered="#{paramIsCalendar}" />
Run Code Online (Sandbox Code Playgroud)
如果我这样做,那么我得到以下错误: java.lang.IllegalStateException: Component ID j_idt64:foo has already been found in the view.
作为一种解决方法,我为每个参数类型创建了许多标签/消息并更改了它们的ID.但这带来了我的问题.如果实际只渲染了一个带有id的组件,为什么我在jsf文件中定义了多个?有没有办法让他们拥有所有相同的ID?