John,
I see where you're going with that - but I need a query that selects
data on a single given date, not "greater or equal" to the date. So I
took your idea, but used BETWEEN and an extra date, like so:
select bd from MdBaseData bd
where bd.upsertDate between :upsertDateStart and :upsertDateEnd
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
Date upsertDateStart = df.parse("20130913");
Date upsertDateEnd = df.parse("20130914");
The resulting generated SQL is as follows:
SELECT t0.BASE_DATA_ID, t0.CRNCY_CODE, t0.datadate, t0.ident,
t0.LAST_PUBLISHED_DATE, t0.PRICE_VAL_1, t0.PRICE_VAL_2,
t0.TYPE_NAME,
t0.UPSERT_DATE FROM MD_BASE_DATA t0
WHERE (t0.UPSERT_DATE >= ? AND t0.UPSERT_DATE <= ?)
[params=(Timestamp) 2013-09-13 00:00:00.0, (Timestamp)
2013-09-14 00:00:00.0]
Now this query will return data on a single date, September 13th, well,
also with a one second overlap
into Sept 14th, but operationally there will never be data inserted at
that second of time.
Thanks for you help!
Regards,
Chris
On 9/13/2013 3:05 AM, Boblitz John wrote:
Hello Chris,
My entities all contain timestamp fields for the creation date of the record.
as a Test, I created the following:
<named-query name="Currency.created">
<query>
SELECT c
FROM Currency c
WHERE c.created <![CDATA[>=]]>
:created
ORDER BY c.code desc
</query>
</named-query>
@Test
public void test() {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("g11dev");
EntityManager em = emf.createEntityManager();
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
try {
Timestamp date = new Timestamp(df.parse("20100101").getTime());
// This is a java.sql.Timestamp !!
TypedQuery<Currency> query =
em.createNamedQuery("Currency.created", Currency.class);
query.setParameter("created", date);
List<Currency> list = query.getResultList();
assertTrue(!list.isEmpty());
} catch (Exception pEx) {
pEx.printStackTrace();
fail();
}
}
The resulting query is:
SELECT t0.uniqueid, t0.versionid, t0.active, t0.created, t0.createdby,
t0.modified, t0.modifiedby, t0.code, t0.description,
t0.includeincustomerlisting, t0.includeinlisting
FROM galaxy11.currency t0
WHERE (t0.created >= ?)
ORDER BY t0.code DESC
[params=(Timestamp) 2010-01-01 00:00:00.0]
and works as expected.
Hope this helps.
Regards,
John
-----Original Message-----
From: Chris [mailto:cwolf.a...@gmail.com]
Sent: Thursday, September 12, 2013 7:47 PM
To: users@openjpa.apache.org
Subject: Re: How to compare fields of type TemporalType.TIMESTAMP - but just
by Date?
In my last post, I asked, "How can I do this in JPA?", but I meant to ask, "How
can I do this in JPQL?".
I'm going to guess it's impossible because I'm not seeing any JPQL
date/datetime manipulation functions in the docs, other then CURRENT_DATE |
CURRENT_TIME | CURRENT_TIMESTAMP, so I resorted to a native SQL query
using the syntax shown in my initial post.
Thanks,
Chris
On 9/12/2013 1:12 PM, Chris wrote:
I have an entity with a timestamp field, but for the purpose of a
certain query, I want to only compare by date - and ignore the time
component of the value.
For example, in Oracle, the raw SQL would look like:
SELECT t0.BASE_DATA_ID, t0.CLIENT_ID, t0.DB_USER, t0.OS_USER,
t0.UPSERT_DATE,
t0.CRNCY_CODE, t0.datadate, t0.ident, t0.LAST_PUBLISHED_DATE,
t0.PRICE_VAL_1, t0.PRICE_VAL_2, t0.TYPE_NAME
FROM MD_BASE_DATA t0
WHERE (t0.CLIENT_ID = 'JUNIT-1'
and to_date(to_char(t0.UPSERT_DATE,'YYYY-MM-DD'),'YYYY-MM-DD')
= to_date(to_char(current_date - 1,'YYYY-MM-DD'),'YYYY-MM-DD'))
This query filters by field "UPSERT_DATE" being yesterday, ignoring
the time part.
How can I do this in JPA?
Thanks,
Chris