@Target(value=METHOD) @Retention(value=RUNTIME) public @interface Increment
Dao
method that increments a counter table that is mapped to an Entity
-annotated class.
Example:
@Entity public class Votes { @PartitionKey private int articleId; private long upVotes; private long downVotes; ... // constructor(s), getters and setters, etc. } @Dao public interface VotesDao { @Increment(entityClass = Votes.class) void incrementUpVotes(int articleId, long upVotes); @Increment(entityClass = Votes.class) void incrementDownVotes(int articleId, long downVotes); @Select Votes findById(int articleId); }
entityClass()
.
The method's parameters must start with the full primary key, in the exact order (as defined
by the PartitionKey
and ClusteringColumn
annotations in the entity class). The
parameter names don't necessarily need to match the names of the columns, but the types must
match. Unlike other methods like Select
or Delete
, counter updates cannot operate
on a whole partition, they need to target exactly one row; so all the partition key and
clustering columns must be specified.
Then must follow one or more parameters representing counter increments. Their type must be
long
or Long
. The name of the parameter must match the name of the entity
property that maps to the counter (that is, the name of the getter without "get" and
decapitalized). Alternatively, you may annotate a parameter with CqlName
to specify the
raw column name directly; in that case, the name of the parameter does not matter:
@Increment(entityClass = Votes.class) void incrementUpVotes(int articleId, @CqlName("up_votes") long foobar);When you invoke the method, each parameter value is interpreted as a delta that will be applied to the counter. In other words, if you pass 1, the counter will be incremented by 1. Negative values are allowed. If you are using Cassandra 2.2 or above, you can use
Long
and pass null
for some of the parameters, they will be ignored (following NullSavingStrategy.DO_NOT_SET
semantics). If you are using Cassandra 2.1, null
values
will trigger a runtime error.
A Function<BoundStatementBuilder, BoundStatementBuilder>
or UnaryOperator<BoundStatementBuilder>
can be added as the last
parameter. It will be applied to the statement before execution. This allows you to customize
certain aspects of the request (page size, timeout, etc) at runtime.
The method can return void
, a void CompletionStage
or CompletableFuture
, or a ReactiveResultSet
.
If a keyspace was specified when creating the DAO (see DaoFactory
), then the generated
query targets that keyspace. Otherwise, it doesn't specify a keyspace, and will only work if the
mapper was built from a Session
that has a default keyspace set.
If a table was specified when creating the DAO, then the generated query targets that table. Otherwise, it uses the default table name for the entity (which is determined by the name of the entity class and the naming convention).
Modifier and Type | Optional Element and Description |
---|---|
Class<?>[] |
entityClass
A hint to indicate the entity class that is being targeted.
|
public abstract Class<?>[] entityClass
Note that, for technical reasons, this is an array, but only one element is expected. If you specify more than one class, the mapper processor will generate a compile-time warning, and proceed with the first one.
Copyright © 2017–2020. All rights reserved.