Entity class:
@Table("user")
public class UserDAO {
@PrimaryKey
private UserKey userKey;
protected UserDAO () {
super();
}
public UserDAO (UserKey userKey, short version) {
super();
this. userKey = userKey;
this.version = version;
}
private short version;
public UserKey getUserKey () {
return responseTimeKey;
}
public void setUserKey(UserKey responseTimeKey) {
this. userKey = userKey;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
…
return builder.toString();
}
}
Composite Key Class:
@PrimaryKeyClass
public class UserKey implements Serializable {
protected UserKey () {
super();
}
public UserKey (String name, Date date) {
super();
this.name = name;
this.date = date;
}
@PrimaryKeyColumn(ordinal = 0, type = PrimaryKeyType.PARTITIONED)
private String name;
@PrimaryKeyColumn(ordinal = 1, type = PrimaryKeyType.CLUSTERED, ordering = Ordering.DESCENDING)
@CassandraType(type = Name.DATE)
private Date date;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public int hashCode() {
…
}
@Override
public boolean equals(Object obj) {
…
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
…
return builder.toString();
}
}
Repository Interface:
public interface UserRepository extends CassandraRepository<UserDAO, UserKey> {
List<UserDAO> findByUserKeyNameAndUserKeyDate(String name, Date date);
List<UserDAO> findAll();
}
- Date is java.util.Date
- Spring Boot: v2.08
- Spring Data Cassandra:v2.0.8
- Cassandra : [cqlsh 5.0.1 | Cassandra 3.11.2 | CQL spec 3.4.4 | Native protocol v4]
I am using application.properties to create autowired connection to Cassandra. When I invoke userRepository.findAll() from controller I get all values with expected Date.
[
{
"userKey": {
"name": "abc",
"date": "2018-05-21T00:00:00.000+0000"
},
"version": 1
},
{
"userKey": {
"name": "bcd",
"date": "2018-05-21T00:00:00.000+0000"
},
"version": 1
},
{
"userKey": {
"name": "def",
"date": "2018-05-21T00:00:00.000+0000"
},
"version": 1
}
]
But when I invoke userRepository.findByUserKeyNameAndUserKeyDate(), below query is triggered and zero results are returned, while passing String name and java.util.Date date as arguments.
Log:
Created query [SELECT * FROM user WHERE name='abc' AND date=1526841000000;]
In cqlsh I get result for
1. SELECT * FROM user WHERE name='abc' AND date=toTimestamp('2018-05-21');
2. SELECT * FROM user WHERE name ='abc' AND date='2018-05-21'
Create Table Query:
CREATE TABLE mykeyspace.user (
name text,
date timestamp,
version int,
PRIMARY KEY (name, date)
) WITH CLUSTERING ORDER BY (date DESC)
Table entries:
name | date | version
---------+---------------------------------+---------
abc | 2018-05-21 00:00:00.000000+0000 | 1
bcd | 2018-05-21 00:00:00.000000+0000 | 1
def | 2018-05-21 00:00:00.000000+0000 | 1
I tried with java.sql.Timestamp - same result; com.datastax.driver.core.LocatDate - findAll() gave cannot convert java.util.Date to LocalDate and findByUserKeyNameAndUserKeyDate() gave same result.
Please help on how to query by date and what am I missing here?