gpt4 book ai didi

java - 如何在访问器中动态定义键空间

转载 作者:行者123 更新时间:2023-11-30 07:18:51 25 4
gpt4 key购买 nike

我正在尝试创建一个访问器来使用 java 在 cassandra 中运行稍微复杂的查询。我对语法没有问题,并且可以让它工作,但我的问题是:有没有办法在访问器中动态声明键空间?例如,如果您为 MappingManager 创建表映射,您将声明 @Table 并为其指定键空间和表名称,如下所示:

@Table(keypace="mykeyspace", name="orders")
public class Orders {
@PartitionKey
public UUID id;
//blah blah blah, rest of code
}

现在为该特定表创建访问器非常简单:

@Accessor
public interface OrdersAccessor {
@Query("SELECT * FROM orders WHERE status = :status")
Result pending(@Param("status") Integer status);
}

简单。问题是它需要一个 key 空间,而我非常喜欢从不对任何东西进行硬编码。我意识到我正在对 MappingManager 类定义中的表定义中的键空间进行“硬编码”,但如果需要,我只在那里更改它,它会更新与之相关的所有内容。如果我在访问器内的每个 @Query 定义中对键空间进行硬编码,那么如果键空间更新,我可能必须更改一堆不同的项目,而不是仅更改 @Table 定义中的一个位置。我已经在 Google 上搜索了几个小时,但找不到一个使用访问器动态声明键空间的实例,只有数千个访问器示例,它们将键空间硬编码到 @Query 中,如下所示:

@Accessor
public interface OrdersAccessor {
@Query("SELECT * FROM keyspace.orders WHERE status = :status")
Result pending(@Param("status") Integer status);
}

我意识到我编写的查询并不是真正导致访问器的原因,我只是为了示例而简化它。所以我来到社区寻求帮助,我在任何地方都找不到任何这样的例子。我无法想象我是第一个想要这样做的人,我只是找不到其他人解决这个问题的任何例子。预先感谢您提供的任何帮助,我真的可以使用它。

最佳答案

@Sudhir 这是我想出的解决方案。我确信有更好的方法来处理连接,但我对 cassandra 和 Java 仍然很陌生,这很适合我的需求。我希望这会有所帮助...

public class DbInterface {

private Cluster cluster;
private Session session;
private Map<String, Session> dbMap;
private Map<String, Map<String, Mapper<Class>>> mappers = new ConcurrentHashMap<>();

public DbInterface(String host) {
Map<String, Session> connections = createConnection(host);
Session crSession = connections.get("crSession");
Session hppSession = connections.get("hppSession");
cluster = Cluster.builder().addContactPoint(host).build();
Session crSession = cluster.connect("mykeyspace");
Session hppSession = cluster.connect("hpp");
MappingManager crManager = new MappingManager(crSession);
MappingManager hppManager = new MappingManager(hppSession);
mappers.put("mykeyspace", new ConcurrentHashMap<>());
mappers.put("mykeyspace2", new ConcurrentHashMap<>());
Map cr = mappers.get("mykeyspace");
Map hpp = mappers.get("mykeyspace2");
cr.put("status", crManager.mapper(OrderStatus.class));
hpp.put("status", hppManager.mapper(OrderStatus.class));
cr.put("status_accessor", crManager.createAccessor(OrderStatusAccessor.class));
hpp.put("status_accessor", hppManager.createAccessor(OrderStatusAccessor.class));
cr.put("users", crManager.mapper(Users.class));
hpp.put("users", hppManager.mapper(Users.class));
cr.put("orders", crManager.mapper(Orders.class));
hpp.put("orders", hppManager.mapper(Orders.class));
cr.put("order_detail", crManager.mapper(OrderDetail.class));
hpp.put("order_detail", hppManager.mapper(OrderDetail.class));
cr.put("chal_orders", crManager.mapper(ChalOrder.class));
hpp.put("chal_orders", hppManager.mapper(ChalOrder.class));
cr.put("chal_order_detail", crManager.mapper(ChalOrderDetail.class));
hpp.put("chal_order_detail", hppManager.mapper(ChalOrderDetail.class));
cr.put("detail_accessor", crManager.createAccessor(OrderDetailAccessor.class));
hpp.put("detail_accessor", hppManager.createAccessor(OrderDetailAccessor.class));
cr.put("tracking_labels", crManager.mapper(TrackingLabels.class));
hpp.put("tracking_labels", hppManager.mapper(TrackingLabels.class));

}

public Session getConnection(String type) {
if(dbMap.containsKey(type)) {
return dbMap.get(type);
}
if(dbMap.containsKey(type.toLowerCase() +"Session")) {
return dbMap.get(type.toLowerCase() +"Session");
}
return dbMap.get("crSession");
}

public Map<String, Session> createConnection(String host) {
dbMap = new HashMap<>();
cluster = Cluster.builder().addContactPoint(host).build();
Session crSession = cluster.connect("mykeyspace");
Session hppSession = cluster.connect("hpp");
dbMap.put("crSession", crSession);
dbMap.put("hppSession", hppSession);
return dbMap;
}

public Map getDBMap(String client) {
if(mappers.containsKey(client)) {
return mappers.get(client);
}
throw new RuntimeException("Unknown Client: " + client);
}

}

我正在考虑做的一件事是将 session 创建和 map 创建移至单独的功能,然后仅连接并构建所需 session 的 map 。就像调用 DbInterface() 时不默认连接到两个 session 一样,只连接到通过“host”参数请求的 session 。

不管怎样,我希望这对你有帮助。如果您需要它,这里是我的其他库使用此的示例...

public class MyRestController {

private final DbInterface db = new DbInterface(IPADDRESS);

@CrossOrigin
@RequestMapping("/status")
public String getStatus() {
Map managerMap = db.getDBMap("mykeyspace");
OrderStatusAccessor statuses = (OrderStatusAccessor) managerMap.get("status_accessor");
Result<OrderStatus> allStatuses = statuses.getAll();
//rest of the code here
}
}

关于java - 如何在访问器中动态定义键空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37928961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com