Please exactly use this example to do that.
You don't need PesonKey class
https://github.com/apache/ignite/blob/master/examples/src/main/java/org/apache/ignite/examples/sql/SqlQueriesExample.java

Get Outlook for iOS<https://aka.ms/o0ukef>
________________________________
From: MJ <6733...@qq.com>
Sent: Tuesday, June 13, 2023 1:24:48 AM
To: user <user@ignite.apache.org>
Subject: Re: Ignite Affinity - sql join Question

No luck.  With the change its throwing exception BinaryObjectImpl cannot be 
cast to java.lang.String  when it tried to put a new entey into "companies" 
cache.

Beside, there is already the @AffinityKeyMapped annotation on companyId field 
of PersioKey class.  AffinityKey needs to be marked on sql join's both left and 
right sides?

Thanks,
MJ

---Original---
From: "Jiang Jacky"<jiang0...@gmail.com>
Date: Tue, Jun 13, 2023 12:34 PM
To: "user@ignite.apache.org"<user@ignite.apache.org>;
Subject: Re: Ignite Affinity - sql join Question

Hello
You have to set your company configuration with affinity key


CacheConfiguration<AffinityKey<String>, Company> companyCfg = 
newCacheConfiguration<>("companies");


Get Outlook for iOS<https://aka.ms/o0ukef>
________________________________
From: MJ <6733...@qq.com>
Sent: Monday, June 12, 2023 10:46:23 PM
To: Chandranana Naik via user <user@ignite.apache.org>
Subject: Ignite Affinity - sql join Question

hi Igniters,

Can you pls advise below ?

It always prints out below WARN message in server side when I am trying to use 
the sql join .  Anything wrong with my configuration or testing code ? Is it 
possible to eliminate that WARN message ?



[ WARN] org.apache.ignite.internal.processors.query.h2.QueryParser - For join 
two partitioned tables join condition should contain the equality operation of 
affinity keys. Left side: PERSON; right side: COMPANY



Ignite version: 2.13.0

see below test code, which is extracted from 
https://ignite.apache.org/docs/latest/data-modeling/affinity-collocation and 
added with some additional annotation changes.



public class AffinityCollocationExample2 {



    static class Person {

        @QuerySqlField(index = true)

        private int id;

        @QuerySqlField(index = true)

        private String companyId;

        @QuerySqlField

        private String name;



        public Person(int id, String companyId, String name) {

            this.id = id;

            this.companyId = companyId;

            this.name = name;

        }



        public int getId() {

            return id;

        }

    }



    static class PersonKey {

        private int id;



        @AffinityKeyMapped

        private String companyId;



        public PersonKey(int id, String companyId) {

            this.id = id;

            this.companyId = companyId;

        }

    }



    static class Company {



        @QuerySqlField(index = true)

        private String id;

        @QuerySqlField

        private String name;



        public Company(String id, String name) {

            this.id = id;

            this.name = name;

        }



        public String getId() {

            return id;

        }

    }



    public void configureAffinityKeyWithAnnotation() {

        CacheConfiguration<PersonKey, Person> personCfg = new 
CacheConfiguration<PersonKey, Person>("persons");

        personCfg.setBackups(1);

        personCfg.setIndexedTypes(PersonKey.class, Person.class);

        personCfg.setSqlSchema("pojo");



        CacheConfiguration<String, Company> companyCfg = new 
CacheConfiguration<>("companies");

        companyCfg.setBackups(1);

        companyCfg.setIndexedTypes(String.class, Company.class);

        companyCfg.setSqlSchema("pojo");



        Ignite ignite = Ignition.start();

        IgniteCache<PersonKey, Person> personCache = 
ignite.getOrCreateCache(personCfg);

        IgniteCache<String, Company> companyCache = 
ignite.getOrCreateCache(companyCfg);



        Company c1 = new Company("company1", "My company");

        Person p1 = new Person(1, c1.getId(), "John");



        // Both the p1 and c1 objects will be cached on the same node

        personCache.put(new PersonKey(p1.getId(), c1.getId()), p1);

        companyCache.put("company1", c1);



        // Get the person object

        p1 = personCache.get(new PersonKey(1, "company1"));



    }



    public static void main(String[] args) throws Exception {

        AffinityCollocationExample2 main = new AffinityCollocationExample2();

        main.configureAffinityKeyWithAnnotation();



        
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++");

        main.test_sql_join_affinity();

        System.exit(0);

    }



    public void test_sql_join_affinity() throws ClientException, Exception {

        String sql = "select a.companyId, b.name from pojo.Person a,  
pojo.Company b where a.companyId = b.id";



        ClientConfiguration cfg = new 
ClientConfiguration().setAddresses("127.0.0.1:10800");



        try (IgniteClient client = Ignition.startClient(cfg)) {

            SqlFieldsQuery query = new SqlFieldsQuery(sql);



            List<List<?>> rets= client.query(query).getAll();

            for(List<?> e : (List<List<?>>)rets) {

                System.out.println(e);

            }

        }

    }

}






Reply via email to