Кэширование кеша запросов критериев в Eclipselink?

Я использую запросы критериев с EclipseLink как JPA. Мне нужно кэшировать результаты запроса на основе их параметров. Когда я использовал query.setHint("eclipselink.QUERY_RESULTS_CACHE", "TRUE"), он все еще запускает запрос к базе данных. Как я могу использовать его в контексте запросов критериев?

Здесь я задаю свой запрос и их подсказки и добавляю NamedQuery

Query query = psEntityManager.getEntityManager().createQuery(criteriaQuery);// Creating Query to supply Values
        query.setHint("eclipselink.QUERY_RESULTS_CACHE", "TRUE");
        query.setHint(QueryHints.QUERY_TYPE,QueryType.ReadObject);
        psEntityManager.getEntityManager().getEntityManagerFactory().addNamedQuery("query1", query);

Вот мой вывод:

Query1-----------
[EL Fine]: sql: 2013-10-10 21:33:35.495--ServerSession(14144548)--Connection(7200601)--SELECT PRIMARYKEY, ADDRESSLINE1, ADDRESSLINE2, PHONENUMBER, fkCityId, fkPersonId FROM ADDRESS WHERE (fkPersonId = ?)
    bind => [2]
[EL Fine]: sql: 2013-10-10 21:33:35.527--ServerSession(14144548)--Connection(7200601)--SELECT PRIMARYKEY, CITYNAME, PINCODE, fkStateId FROM CITY WHERE (PRIMARYKEY = ?)
    bind => [2]
[EL Fine]: sql: 2013-10-10 21:33:35.528--ServerSession(14144548)--Connection(7200601)--SELECT PRIMARYKEY, STATENAME FROM STATE WHERE (PRIMARYKEY = ?)
    bind => [1]
[EL Fine]: sql: 2013-10-10 21:33:35.531--ServerSession(14144548)--Connection(7200601)--SELECT PRIMARYKEY, AGE, DOB, FIRSTNAME, LASTNAME, SEX, TIMESTAMP, fkDepartmentId FROM PERSON WHERE (PRIMARYKEY = ?)
    bind => [2]
[EL Fine]: sql: 2013-10-10 21:33:35.541--ServerSession(14144548)--Connection(7200601)--SELECT PRIMARYKEY, DEPTNAME FROM DEPARTMENT WHERE (PRIMARYKEY = ?)
    bind => [2]
[EL Fine]: sql: 2013-10-10 21:33:35.547--ServerSession(14144548)--Connection(7200601)--SELECT PRIMARYKEY, CITYNAME, PINCODE, fkStateId FROM CITY WHERE (PRIMARYKEY = ?)
    bind => [5]
[EL Fine]: sql: 2013-10-10 21:33:35.548--ServerSession(14144548)--Connection(7200601)--SELECT PRIMARYKEY, STATENAME FROM STATE WHERE (PRIMARYKEY = ?)
    bind => [3]
[EL Fine]: sql: 2013-10-10 21:33:35.551--ServerSession(14144548)--Connection(7200601)--SELECT PRIMARYKEY, CITYNAME, PINCODE, fkStateId FROM CITY WHERE (PRIMARYKEY = ?)
    bind => [8]
[EL Fine]: sql: 2013-10-10 21:33:35.553--ServerSession(14144548)--Connection(7200601)--SELECT PRIMARYKEY, STATENAME FROM STATE WHERE (PRIMARYKEY = ?)
    bind => [4]
Query2-----------
[EL Fine]: sql: 2013-10-10 21:33:35.557--ServerSession(14144548)--Connection(7200601)--SELECT PRIMARYKEY, ADDRESSLINE1, ADDRESSLINE2, PHONENUMBER, fkCityId, fkPersonId FROM ADDRESS WHERE (fkPersonId = ?)
    bind => [2]
Query3-----------
[EL Fine]: sql: 2013-10-10 21:33:35.56--ServerSession(14144548)--Connection(7200601)--SELECT PRIMARYKEY, ADDRESSLINE1, ADDRESSLINE2, PHONENUMBER, fkCityId, fkPersonId FROM ADDRESS WHERE (fkPersonId = ?)
    bind => [2]
Query4-----------
[EL Fine]: sql: 2013-10-10 21:33:35.563--ServerSession(14144548)--Connection(7200601)--SELECT PRIMARYKEY, ADDRESSLINE1, ADDRESSLINE2, PHONENUMBER, fkCityId, fkPersonId FROM ADDRESS WHERE (fkPersonId = ?)
    bind => [2]

person Achyut    schedule 10.10.2013    source источник
comment
Вы сохраняете этот запрос как именованный запрос? EMF в JPA 2.1 предоставляет addNamedQuery для динамического хранения именованных запросов.   -  person Chris    schedule 10.10.2013
comment
@Chris Нет, этот запрос является запросом критериев   -  person Achyut    schedule 10.10.2013
comment
@Chris, пожалуйста, пришлите ссылку для более подробной информации   -  person Achyut    schedule 10.10.2013
comment
выполнить один и тот же запрос с одними и теми же параметрами в одном и том же контексте несколько раз подряд - каждый раз он попадает в базу данных? Что касается ссылок, проверьте спецификацию JPA 2.1. Вы можете создать запрос и добавить его в EMF с помощью addNamedQuery, чтобы его можно было найти и повторно использовать с API createNamedQuery.   -  person Chris    schedule 10.10.2013
comment
@Крис спасибо!! Я сделал, но не работал, он все еще запускал запросы несколько раз. Любое другое решение, пожалуйста..   -  person Achyut    schedule 10.10.2013
comment
Можете ли вы показать код и что вы используете для проверки результатов?   -  person Chris    schedule 10.10.2013
comment
@Chris Я обновил, пожалуйста, смотрите изменения (query1, query2, ...) — запросы, запускаемые несколько раз, связываются с одним и тем же значением.   -  person Achyut    schedule 10.10.2013


Ответы (1)


Удалите query.setHint(QueryHints.QUERY_TYPE,QueryType.ReadObject) или сначала вызовите его. query_type изменяет базовый объект запроса, и не все подсказки могут быть скопированы в новый объект. В любом случае это кажется ненужным.

person Chris    schedule 10.10.2013
comment
никакого эффекта после удаления. Я использую этот блок кода всякий раз, когда создаю запрос, используя criteia. - person Achyut; 10.10.2013
comment
вы не показали, как вы выполняете запрос несколько раз. - person Chris; 10.10.2013
comment
Я имею в виду, что для каждого запроса я создаю запрос с использованием построителя критериев и использую приведенный выше блок кода, а затем получаю от него результат. - person Achyut; 10.10.2013
comment
Это означает, что вы не используете свой именованный запрос повторно. Создайте запрос один раз, выполните его несколько раз. em.createNamedQuery (запрос1) - person Chris; 10.10.2013
comment
Да! он снова и снова создает запрос и устанавливает для него подсказки, понял, большое спасибо! - person Achyut; 10.10.2013