public int save(String tableName, Map<String, Object> dataMap) throws IllegalAccessException {
SimpleStatement saveStatement = QueryBuilder.insertInto(tableName).values()
return 1;
}
我已經嘗試了 QueryBuilder 的其他內置方法來將地圖值保存為一個整體,但如果使用“values()”方法并且我已經有一個 map<String,則只能使用 map<String,Term> 型別的地圖來保存資料,Object>.This 需要做一個動態表 ps 我對動態表不太熟悉。我嘗試使用回傳型別整數的另一種方法是
public int save(String tableName, Map<String, Object> dataMap) throws IllegalAccessException {
SimpleStatement updateStatement = QueryBuilder.update(tableName)
.set(appendSet(dataMap))
.where(appendWhere(domainId))
.build();
log.info(updateStatement.getQuery());
return 1;
}
private Iterable<Assignment> appendSet(Map<String, Object> dataMap) throws IllegalAccessException {
List<Assignment> assignments = new ArrayList<>();
for (Field field : dataMap.getClass().getDeclaredFields()) {
if (!field.getName().equals("key")) {
try {
field.setAccessible(true);
if (field.get(dataMap) != null) {
if (field.getType().equals(Long.class)) {
assignments.add(Assignment.setColumn(field.getName(), literal(Long.valueOf(field.get(dataMap).toString()))));
} else {
assignments.add(Assignment.setColumn(field.getName(), literal(field.get(dataMap))));
}
}
} catch (IllegalAccessException e) {
log.catching(e);
}
}
}
return assignments;
}
private Iterable<Relation> appendWhere(Object key) {
List<Relation> relations = new ArrayList<>();
for (Field field : key.getClass().getDeclaredFields()) {
try {
field.setAccessible(true);
if (field.get(key) != null) {
if (field.getType().equals(Long.class)) {
relations.add(Relation.column(field.getName()).isEqualTo(literal(Long.valueOf(field.get(key).toString()))));
} else {
relations.add(Relation.column(field.getName()).isEqualTo(literal(field.get(key))));
}
}
} catch (IllegalAccessException e) {
log.catching(e);
}
}
return relations;
}
這可能也行不通。我需要使用 save 方法回傳一個整數,但我無法弄清楚如何使用 QueryBuilders 或 CassandraTemplate 將地圖值插入到 cassandra 表中。我正在使用 Cassandra 資料庫,我的表是動態的。誰能給我推薦一篇好文章或任何東西?我找到了文章,但這些文章并沒有幫助我將映射鍵值對插入表中,所以我很掙扎。任何幫助,將不勝感激。
uj5u.com熱心網友回復:
Cassandra 資料建模提醒
Cassandra 沒有動態表之類的東西,它使用嚴格的模式。我會爭辯說,如果您沒有找到任何樣本,那是因為它是一種反模式。
使用 Cassandra 資料庫,您可以從設計查詢開始,然后才定義表,因為 ** 您只能過濾主鍵中的欄位(where 子句的一部分)。我提到這Iterable<Relation> appendWhere(Object key)是可疑的,在 Cassandra 中沒有連接或關系。
如果在同一資料上出現新查詢,則將資料復制到另一個表中(是的,關系或面向檔案的情況不同)
在您的應用程式初始化時,您使用prepare(靜態)陳述句來驗證語法并PrepareStatementID與服務器共享。
@PostConstruct
public void prepareStatements() {
PreparedStatement stmtCreateUser =
session.prepare(QueryBuilder.insertInto(USER_TABLENAME)
.value(USER_EMAIL, QueryBuilder.bindMarker())
.value(USER_FIRSTNAME, QueryBuilder.bindMarker())
.value(USER_LASTNAME, QueryBuilder.bindMarker())
.ifNotExists().build());
}
^ 注意定義中使用的常量。稍后當您為額外的表重用列名或重命名列時,除錯起來會更容易。
給定一個表:
CREATE TABLE IF NOT EXISTS users_by_city (
city name,
firstname text,
lastname text,
email text,
PRIMARY KEY ((city), lastname, firstname, email)
);
合法但不推薦:
// This query is legal but never forget the where clause or you do full scan cluster
SELECT [fields] FROM users_by_city;
// This query is legal as you provide the partition in the where clause but having * in the select is hazardous if columns are added later.
SELECT * FROM users_by_city WHERE city=?
法律查詢
SELECT firstname,lastname,email FROM users_by_city WHERE city=?
SELECT firstname,email FROM users_by_city WHERE city=? and lastname=?
// order is important
SELECT firstname,email FROM users_by_city WHERE city=? and lastname=? and firstname=?
非法查詢
// city is required in PK
SELECT firstname,email FROM users_by_city WHERE lastname=? and firstname=?
// order of cluster columns are important
SELECT firstname,email FROM users_by_city WHERE a city=? and firstname=?
實施細則
有了所有這些提醒(對不起,如果你已經知道那些后來可能會提出問題的人的所有想法......)這里有一些想法。
QueryBuilder 已經是動態構建查詢的構建器,但查看您的代碼可以想到
插入
public SimpleStatement insertInto(String keyspace,
String tableName, Map<String, Object> fields) {
return QueryBuilder.insertInto(keyspace, tableName)
.values(fields.entrySet()
.stream().collect(Collectors.toMap(
entry -> entry.getKey(),
entry -> QueryBuilder.literal(entry.getValue()))))
.build();
}
選擇
public SimpleStatement selectFrom(String keyspace, String tableName, Map<String, Relation> fields) {
return QueryBuilder.selectFrom(keyspace, tableName)
.columns(fields.keySet())
.where(fields.values())
.build();
}
額外資源
- 更多資訊可以在檔案中找到
- 希望此代碼可以幫助您
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/326751.html
