I have problems to get the full DATE info from my Oracle DB (dd/mm/yyyy hh/mm/ss).
In the db level, in the column that I want to receive I set test values:
update my_table
set my_date_column=(to_date('2011-06-15 15:43:12', 'yyyy-mm-dd hh24:mi:ss'));
but in my JPA entity I have:
#Column(name = "MY_DATE_COLUMN")
#Temporal(TemporalType.DATE)
private Date dateDetailed;
public Date getDateDetailed() {
if (this.dateDetailed!= null) {
return this.dateDetailed;
}
return null;
}
public void setDateDetailed(Date dateDetailed) {
if (dateDetailed!= null) {
this.dateDetailed= dateDetailed;
} else {
this.dateDetailed= null;
}
}
Each time I acccess my object, It is giving me date without hours, min and seconds.
I tried to use TemporalType.TIMESTAMP, but in that case I would need to also change column type in db (which I want to avoid).
Any suggestions?
Its the TemporalType.DATE
You will need TIME or TIMESTAMP. DATE is only the date without time. TIMESTAMP is represented as a number.
By using the TIMESTAMP temporal type, you will get the date and the time part of the java date datatype but Oracle will make a column with the TIMESTAMP datatype. To overcome this issue if you want a DATE datatype, you can use the columnDefinition parameter of the column annotation such as:
#Column(name = "MY_DATE_COLUMN", columnDefinition = "DATE")
#Temporal(TemporalType.TIMESTAMP)
private Date dateDetailed;
Related
This question already has answers here:
Java string to date conversion
(17 answers)
Closed 4 years ago.
The user inputs a date as a string, but I need to make that insertable to the database column of datatype DATE. This is how I've defined my startDate variable in my Event.java class:
#Column(name = "start_date")
#Temporal(javax.persistence.TemporalType.DATE)
private Date startDate;
Note: The Date datatype is from the class java.util.Date
The user inputs the date like this:
I fetch that data as a string value with the following bit of code in my controller:
#RequestMapping(value = "/addEvent", method = RequestMethod.POST)
public String addEvent(
//OTHER PARAMETERS
#RequestParam("startDate") String startDate,
//OTHER PARAMETERS
) {
//CODE TO MAP EVENT DATA TO THE ENTITY CLASS
eventDAO.insert(event);
return "redirect:/";
}
The above code successfully inserts an event to the database but leaves the start_date column NULL. How do I parse the string value to a date datatype so as to be insertable into the MySQL DB?
EDIT:
I tried adding the following to parse it but it still inserts NULL.
Date finalStartDate=null;
String startDateParser = startDate;
DateFormat format = new SimpleDateFormat("MM/dd/yyyy");
try{
finalStartDate = format.parse(startDateParser);
System.out.println(finalStartDate);
} catch(ParseException ex){
System.out.println(ex.getMessage());
}
Event event = new Event();
//MAPPING OTHER DATA
event.setStartDate(finalStartDate);
I got this message in my server:
Unparseable date: "2018-04-19"
The specific error in this case is the wrong date format. Instead of MM/dd/yyyy you should use yyyy-MM-dd in order to parse the date.
If the date cannot be parsed null is inserted in the database and that is ok. This means that the format of the date is wrong.
Here is a snippet of code which should work be able to parse the date:
String startDateParser = "2018-04-19";
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date finalStartDate = null;
try {
finalStartDate = format.parse(startDateParser);
System.out.println(finalStartDate);
} catch (ParseException ex) {
System.out.println(ex.getMessage());
}
Given this Entity I need to post the new Object of type Contracts. I
http://www.springframework.org/tags/form tag form/sf. I also got jquery datapicker. The problem I have got is datapicker returns a String not Date object. How can it be parsed? The only solution I think will work is to get date from datepicker as #RequestParam in the #Controller class and parse it as a java.util.Date object.
#Entity
#Table(name = "contract")
public class Contracts {
#Id
#Column(name = "contract_id")
private int contractId;
#Column(name = "date_added")
private Date creationDate;
#Column(name = "date_start")
private Date startDate;
#Column(name = "date_end")
private Date finishDate;
#NotNull
#Column(name = "payment_amount")
private Integer paymentAmount;
#Column(name = "payment_type")
#Enumerated(EnumType.STRING)
private PaymentType paymentType;
private boolean valid;
#ManyToOne
#JoinColumn(name = "system_id")
private Systems system;
And this is 'POST' part of my Controller class.
#RequestMapping(value = "/createcontract", method = RequestMethod.POST)
public String createContract(#ModelAttribute("contract") #Valid final Contracts contract, BindingResult results,
#RequestParam("system-id") int systemId) {
if(results.hasErrors())
return "newcontract";
return "redirect:contracts";
Another question (because I tagged postgresql) is whether is 'all-right' to store java.util.Data object in postgresql as just date or maybe I should store it as 'timestamp with time zone'?
jQuery UI DatePicker gives Date object
The plugin allows you to obtain a Date object using getDate method.
Here is a Plunker with a working example.
$(function() {
$('#datePicker').datepicker();
$('#datePicker').on('change', () => {
let date = $('#datePicker').datepicker('getDate');
alert(`Date ${date} is ${date instanceof Date ? 'a Date object' : 'not a Date object'}`);
});
});
Date type - JPA to PostgreSQL mapping
Use timestamp with time zone in PostgreSQL
Usually is best to keep your dates as UTC in your database. This will give the most flexibility as you can represent the date in whichever zone you desire. This translates into using the timestamp with time zone as a type which will store as UTC. This means that your date time, before being stored, is added the zone offset in order to obtain the UTC.
Set the timezone to UTC of your JVM or your JPA provider
Is important that all your dates are expressed as UTC and not in a specific time zone. And when these are sent via the wire to your database the session needs to have the UTC time zone.
This means that the timezone needs to be UTC on JVM or JPA provider (eg: Hibernate).
As explained in this blog you can set UTC by:
JVM: java -Duser.timezone=UTC -jar blabla.jar
Or by
JVM: TimeZone.setDefault(TimeZone.getTimeZone("Etc/UTC"));
Or by
Hibernate: (application.properties) spring.jpa.properties.hibernate.jdbc.time_zone = UTC
Check which version works for you.
Persisting Date field
Therefore your field can be expressed as:
#Column(name = "date_added", columnDefinition = "TIMESTAMP WITH TIMEZONE")
#Temporal(TemporalType.TIMESTAMP)
private Date creationDate;
And you need to ensure that the Date object represents a date time in UTC.
Useful mappings
You can store your Date object in PostgreSQL as:
timestamp with or without timezone
time with or without timezone
date
Using the JPA annotation #Temporal applied on your Date field you can specify how the object is being mapped:
#Temporal(TIMESTAMP) to timestamp
#Temporal(DATE) to date
#Temporal(TIME) to time
Also specifying that your column is timestamp with timezone can be stated using annotation #Column(columnDefinition = "TIMESTAMP WITH TIMEZONE").
import java.sql.Timestamp;
oR
import java.sql.Date;
add this import ur pojo .
in my MySql database I store date as DATE type so I store only YYYY-MM-DD without any information about time (in the other table I use DATETIME to store also time information).
My entity is :
#Entity
#Table(name = "clientlicense", catalog = "ats")
public class ClientLicense implements java.io.Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer idClientLicense;
private Date startDate;
private Date endDate;
private int counter;
private String macAddress;
private String cpuId;
But when i get startDate and endDate from my WebUi I receive even the time like 2016-01-29 00:00:00.0
How can I store only the date as into database? Do I have to work in my HTML code?Thanks
Try with #Temporal JPA annotations.
Anotating your field and changing the type should help:
#Temporal(TemporalType.TIMESTAMP)
private java.util.Date startDate;
The valid values are:
TemporalType.DATE
TemporalType.TIME
TemporalType.TIMESTAMP
It is equivalent of
DATE – equivalent of java.sql.Date
TIME – equivalent of java.sql.Time
TIMESTAMP – equivalent of java.sql.Timestamp
Your entity mapping seems ok to me. The java.util.Date class ships also time information.
You will need to format the date object on the web tier. The implementation depends on the technology you are using on the front-end.
For example if you are on a plain JSP page you could format with a java.text.SimpleDateFormat object.
I have an Hibernate class and for a time column in MySqlDb I'm using in Java
#Type(type="org.joda.time.contrib.hibernate.PersistentLocalTimeAsTime")
#Column(name = "hour", length = 8)
public LocalTime getHour() {
return this.hour;
}
So my problem is if I have in DB 07:20:33
when I get the value I have 06:20:33
I have an Oracle function which accepts amongst other things, a date as parameter, and returns a date. The function is like this:
FUNCTION my_func(par1 IN DATE, par2 IN NUMERIC) RETURN DATE AS
ret_val DATE;
BEGIN
....
END;
I need to call this function in my Java application, and am currently doing so with JPQL. The code is for a web application running on JBoss 5, and looks like this:
Query q = entityMng.createNativeQuery("SELECT MY_FUNC(?1,?2) FROM DUAL");
java.util.Date now = new Date();
long param2 = 110L;
q.setParameter(1, now);
q.setParameter(2, param2);
java.sql.Date retSql = null;
Object obj = q.getSingleResult();
if (obj != null) {
retSql = (java.sql.Date) obj;
}
After executing the code the retSql variable contains the correct date but has a time = 00.00.000. I obtain the same behaviour even when using java.util.Date as opposed to java.sql.Date, as the type for retSql.
While investigating this problem I cam across this SO post How to convert correctly an Oracle Date field into java.util.Date through JPA, but I don't understand how to use "addScalar" in my case.
Any help would be appreciated, thanks in advance.
Try returning a TIMESTAMP in your function, not a DATE. DATE is now only a date in Oracle, and TIMESTAMP is suppose to be used for date/time. There is a backward compatibility flag you can set in JDBC to control this.
What JPA provider are you using? EclipseLink should be handling this automatically.
What about using XMLAdapter;
public class DateAdapter extends XmlAdapter {
// the desired format
private String pattern = "yyyy-MM-dd HH:mm:ss";
/*few more formats http://www.xyzws.com/javafaq/how-to-use-simpledateformat-class-formating-parsing-date-and-time/142 */
public String marshal(Date date) throws Exception {
return new SimpleDateFormat(pattern).format(date);
}
public Date unmarshal(String dateString) throws Exception {
return new SimpleDateFormat(pattern).parse(dateString);
}
And then adding it to your Entity; for example
private java.util.Date originDate;
#XmlJavaTypeAdapter(DateAdapter.class)
#Column(name = "ORIGIN_DATE", nullable = true)
#XmlElement(namespace = "my-namespace")
public Date getOriginDate() {
return this.originDate;
}
Here is a tutorial that I used to learned about this;
http://weblogs.java.net/blog/kohsuke/archive/2005/04/xmladapter_in_j.html