This feature is to enable use of L2 cache with complex natural keys with findList() queries in cases where the IN clause is not a single property but instead a pair of properties.
These queries can have predicates that can be translated into a list of complex natural keys such that the L2 cache can be hit with these keys to obtain some or all of the beans from L2 cache rather than the DB.
// where a bean is annotated with a complex
// natural key made of several properties
@Cache(naturalKey = {"store","code","sku"})
Pairs pairs = new Pairs("sku", "code");
pairs.add("sj2", 1000);
pairs.add("sj2", 1001);
pairs.add("pf3", 1000);
List<OCachedNatKeyBean3> list = DB.find(OCachedNatKeyBean3.class)
.where()
.eq("store", "def")
.inPairs(pairs) // IN clause with 'pairs' of values
.order("sku desc")
// query expressions cover the natural key properties
// so we can choose to hit the L2 bean cache if we want
.setUseCache(true)
.findList();
Important implementation Note
When binding many pairs of values we want to be able to utilise a DB index (as this type of query usually means the pairs are a unique key/index or part of a unique key/index and highly selective). Currently we know we can do this on any DB that supports expression/formula based indexes. using a DB string concatenation formula
This means, the implementation converts the list of pairs into a list of strings via concatenation and we use a DB concatenation formula to match. We see SQL like:
sql
...
where t0.store = ? and (t0.sku||'-'||t0.code) in (?, ? )
// bind values like: "sj2-1000", "pf3-1000"
We often create a DB expression index to match the DB concat formula like:
sql
create index ix_name on table_name (sku || '-' || code);
-
Nested Class Summary
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionAdd a pair of value objects.Return the separator character used with DB varchar concatenation to combine the 2 values.concatSeparator
(String concatSeparator) Set the separator character used with DB varchar concatenation to combine the 2 values.Return a suffix used with DB varchar concatenation to combine the 2 values.concatSuffix
(String concatSuffix) Add a suffix used with DB varchar concatenation to combine the 2 values.entries()
Return all the value pairs.Return the first property name.Return the second property name.toString()
-
Constructor Details
-
Pairs
Create with 2 property names.- Parameters:
property0
- The property of the first valueproperty1
- The property of the second value
-
-
Method Details
-
add
Add a pair of value objects.Both values are expected to be immutable with equals and hashCode implementations.
- Parameters:
a
- Value of the first propertyb
- Value of the second property
-
property0
Return the first property name. -
property1
Return the second property name. -
entries
Return all the value pairs. -
concatSeparator
Return the separator character used with DB varchar concatenation to combine the 2 values. -
concatSeparator
Set the separator character used with DB varchar concatenation to combine the 2 values. -
concatSuffix
Return a suffix used with DB varchar concatenation to combine the 2 values. -
concatSuffix
Add a suffix used with DB varchar concatenation to combine the 2 values. -
toString
-