Problem mit @Temporal Mapping und SQL Server

markus.beckmann

Neues Mitglied
Hallo,

Beim ausführen einer JPA Query bekomme ich folgenden Fehler:
"Die Datentypen time und datetime sind im greater than or equal to-Operator inkompatibel."

Was mich vermuten lässt, dass etwas mit dem @Temporal Mapping nicht korrekt funktioniert.


Java:
public List<BuchungStundenabrechnung> getZeit() {		
		Date ende = new Date();	
		TypedQuery<BuchungStundenabrechnung> q = entityManager.createQuery("select b from BuchungStundenabrechnung b where b.ende >= :ende", BuchungStundenabrechnung.class);
		q.setParameter("ende", ende);	
		return q.getResultList();
	}

### SQL SERVER 10.50.1600.1 ###
Feld:

Ende time(0)

### Mapping Details###

@Entity
@Table(name="[Abgerechnete Zeit]")
public class BuchungStundenabrechnung

private Date ende; //(java.sql.Time wirft auch einen Typfehler)

@Temporal(TemporalType.TIME)
@Column(name="Ende")
public Date getEnde() {
return ende;
}

### Config Datasource###
<bean id="stundenabrechnungDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="xxx"/>
<property name="password" value="xxx"/>
<property name="driverClass" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="jdbcUrl" value="jdbc:sqlserver://xxx:1433;database=stundenabrechnungTestSQL"/>
</bean>

### Config Entitymanager ###
<bean id="entityManagerFactoryStundenabrechnung" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<!-- <property name="persistenceUnitManager" ref="pum"></property> -->
<property name="persistenceUnitName" value="stundenabrechnungDB_pu"></property>
<property name="dataSource" ref="stundenabrechnungDataSource"/>
</bean>

### Config PU ###
<persistence-unit name="stundenabrechnungDB_pu" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider> <class>de.daphi.integrationwebapp.stundenabrechnung.domain.BuchungStundenabrechnung</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.use_sql_comments" value="true" />
<property name="hibernate.cache.use_query_cache" value="false" />
<property name="hibernate.cache.use_second_level_cache" value="false" />
</properties>
</persistence-unit>


Der selbe Test auf ein Feld in einer Mysql Datenbank bringt keine Fehlermeldung. @Temporal wird richtig angewendet.

Könnt ihr mir weiterhelfen, Google sagt nichts zu diesem Problem.

Gruß Markus
 
Ich glaube, dass MSSQL dein gemapptes Date aufgrund der Annotation als Time ansieht und Dein Referenzdatum "new Date()" als TimeStamp und deswegen sagt, die Typen seien inkompatibel. Da könnten die in JPQL eingebauten Schlüsselwörter helfen:
CURRENT_DATE: Returns the current date.
CURRENT_TIME: Returns the current time.
CURRENT_TIMESTAMP: Returns the current timestamp.

Nimm also CURRENT_TIME anstatt "new Date()" mit Parameter. Dein Query-String wäre dann wie folgt:
"select b from BuchungStundenabrechnung b where b.ende >= CURRENT_TIME"

Einen etwas allgemeineren Workaround habe ich dann noch hier gefunden: Software Development Fun A Lot Ever: Date and DateTime comparisons in JPQL
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben