powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / jpql как вернуть min max в одном запросе ?
10 сообщений из 35, страница 2 из 2
jpql как вернуть min max в одном запросе ?
    #39258225
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraесли есть возможность спускаться от jpa к hibernate
+1
...
Рейтинг: 0 / 0
jpql как вернуть min max в одном запросе ?
    #39258651
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ivanraесли есть возможность спускаться от jpa к hibernate
+1

Прошу пояснить и более глубже раскрыть мысль ?


как я понял , на данный момент hibernate 5.2 полностью поддерживает jpa 2.1 спецификацию.

т.е если мне нужно что то новое из 5.2 ,что есть только в Хибере

я должен делать нечто подобное

Код: java
1.
Session session = entityManager.unwrap(Session.class);



или

Код: java
1.
Session session = (Session) entityManager.getDelegate();




Так же , как я понимаю вместо @persistencecontext entitymanager использовать SessionFactory sessionFactory;
и в каждом методе делать
Session session = sessionFactory.getCurrentSession();




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
@PersistenceContext
EntityManager entityManager;

public List<MyEntity> findSomeApples() {
  return entityManager
     .createQuery(MyEntity.class, "from MyEntity where apples=7")
     .getResultList();
}



нужно будет расставлять спринговые @Transactional как и раньше без изменений ?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Autowired
SessionFactory sessionFactory;

public List<MyEntity> findSomeApples() {
  Session session = sessionFactory.getCurrentSession();
  List<?> result = session.createQuery("from MyEntity where apples=7")
      .list();
  @SuppressWarnings("unchecked")
  List<MyEntity> resultCasted = (List<MyEntity>) result;
  return resultCasted;
}
...
Рейтинг: 0 / 0
jpql как вернуть min max в одном запросе ?
    #39258670
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или на двух стульях сидеть не получится ???

ибо классический jpa конфиг такой :



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
   @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        return configurer;
    }

    @Bean
    @Qualifier("dataSource")
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("");

        dataSource.setUsername("root");
        dataSource.setPassword("root");

        return dataSource;
    }


    @Autowired
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(@Qualifier("dataSource") DataSource dataSource) {

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setShowSql(true);
        

        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource);
        em.setPackagesToScan(new String[]{
            "ru.entities",});
        em.setPersistenceUnitName("testPersistanceUnit");

        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(additionalProperties());

        return em;

    }

    @Autowired
    @Bean(name = "transactionManager")
    @Qualifier("transactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory);
        return txManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

 Properties additionalProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.bytecode.use_reflection_optimizer", "false");
        properties.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");
        properties.setProperty("hibernate.hbm2ddl.auto", "validate");//update validate
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.format_sql", "true");
        properties.setProperty("hibernate.connection.characterEncoding", "utf8");

        properties.setProperty("hibernate.connection.Useunicode", "true");

        properties.setProperty("hibernate.default_batch_fetch_size", "16");
        properties.setProperty("hibernate.max_fetch_depth", "3");
        properties.setProperty("hibernate.jdbc.fetch_size", "50");

        return properties;
    }



а для Хибера нужно указывать :
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
        
    @Bean(name = "sessionFactory")
    LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
        return sessionFactoryBean;
    }
    
    @Autowired
    @Bean(name = "transactionManager")
    @Qualifier("transactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("sessionFactory") LocalSessionFactoryBean sessionFactory) {

        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(sessionFactory);
        return txManager;
    }




т.е если в jpa - мы указываем Хибер как вендора ,то при явном указании идет просто sessionFactory.


возможно ли иметь настройку по умолчанию jpa - а по необходимости использовать sessionFactory ?

или лучше сразу конфигурипровать все под Хибер ?
...
Рейтинг: 0 / 0
jpql как вернуть min max в одном запросе ?
    #39258697
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Atum1,
если в чистом хибере, то вот это работает
Код: java
1.
2.
3.
4.
5.
@Autowired
SessionFactory sessionFactory;

@Transactional
blablabla


насчет комбинирования - я лично в связке со спрингом не пробовал
Код: java
1.
Session session = (Session) em.getDelegate();


В CDI это работало. При этом есть подозрение, что изменения, что сделанные на уровне хибера, на более высоком уровне (jpa EntityManager) не будет видно, но нужды проверять не было, поэтому не знаю.
Ну и в принципе, берем "легковесный" спринг, но зачем-то тянем jpa
...
Рейтинг: 0 / 0
jpql как вернуть min max в одном запросе ?
    #39258714
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,

Написал тест

там сессия получается явно закрывая

работает только через

session = session.getSessionFactory().openSession();

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    @Override
    @Transactional
    public Employee findOneH(Integer id) {


        Session session = (Session) em.getDelegate();//
//     session = session.getSessionFactory().getCurrentSession(); // ЗАКРЫТАЯ СЕССИЯ !!!!
        session = session.getSessionFactory().openSession(); //  так работает !!!!
        Employee employee = (Employee) session.get(Employee.class, id);
        session.close();
        return employee;
    }




Нужно конечно разбираться - но пока JPA более предпочтителен ... чем читстый Хибиер

Ибо они с каждым новым чеклистом чистят

https://github.com/hibernate/hibernate-orm/wiki/Migration-Guide---5.2

подгоняя все под JPA 2.1

http://in.relation.to/2016/06/01/hibernate-orm-520-final-release/

(
я даю отчет что Чистый Хибер это монстр - по возможностям - это как сравнивать возможности Спринг и javaEE спеки ...
спринг > javaee
Хибер > jpa 2.1

)

И Если я сделал свой вабор три года назад и ушел от java ee на спринг ,о чем не жалею ... то вот так вот полностью перестить все на Хибер - очень боязно ... все таки в области работы с обастью постоянства лучше придерживаться пусть и куцой но спецификации jpa - ИМХО, конечно ...

может я и не прав.



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Java 8 baseline
5.2 moves to Java 8 as its baseline, both for JDK and JRE. This means:

The hibernate-java8 module has been removed; that functionality has been consolidated into hibernate-core.

Native support for Java 8 date/time types as Query parameters.

Support for streaming (java.util.stream.Stream) query results.

Support for java.util.Optional as return from methods that may return null.

Leveraging Java 8 "default methods" when introducing new methods to extension points.



из плюсов + новые фишки
http://in.relation.to/2016/02/10/hibernate-orm-510-final-release/
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
ntity joins (or ad hoc joins)
In HQL you now have the ability to define a join to an entity, not just a mapped association. For example:

select ...
from FinancialRecord f
    left join User u
        on r.lastUpdateBy = u.username
See HHH-16 for details.

load-by-multiple-id API
Loading multiple entities of same type by identifier is now a first class API much like loading a single entity by identifier. For example:

// load Users 1, 2 and 3 at one shot
List<User> users = session.byMultipleIds(User.class)
    .multiLoad( 1, 2, 3 );
...
Рейтинг: 0 / 0
jpql как вернуть min max в одном запросе ?
    #39258913
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще один нубовский вопрос про employeeService.findOne(2)

Если хочу догрузить данные для бина то получаю
org.hibernate.LazyInitializationException: could not initialize proxy - no Session

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    @Test
    public void test4() {

        final StopWatch stopWatch = new StopWatch();
        stopWatch.start("employeeService.findOne");
        Employee employee = employeeService.findOne(2);
        stopWatch.stop();
        System.out.println(employee);
        System.out.println(stopWatch.prettyPrint());
    }



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
@Service
@Repository
public class EmployeeServiceImpl implements EmployeeService {

    @PersistenceContext
    private EntityManager em;
    
    protected final EmployeeRepository repository;

    @Autowired
    public EmployeeServiceImpl(EmployeeRepository repository) {
        super();
        this.repository = repository;
    }


    @Override
    @Transactional(readOnly = true)
    public Employee findOne(Integer id) {
       Employee employee =  em.find(Employee.class, id);
// тут получаю       //org.hibernate.LazyInitializationException: could not initialize proxy - no Session
       employee.getDepartmentId().getId();
       employee.getEmployeeId().getId();
        int size = employee.getEmployees().size();
    
       return employee;
    }
    



//em.getTransaction().begin(); //em.getTransaction().commit(); обернуть в непомогает .
...
Рейтинг: 0 / 0
jpql как вернуть min max в одном запросе ?
    #39258928
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сразу скажу что если делать PersistenceContextType.EXTENDED

Код: java
1.
2.
  @PersistenceContext(type = PersistenceContextType.EXTENDED)
    private EntityManager em;



то все будет работать - дергать буем все у экземпляра и все будет подсасываться отдельными запросами ...


вопрос именно как на уровне метода когда по умолчению задано так?

как EntityManager заставить внутри метода не закрываться ?

когда выставлено поле :

Код: java
1.
2.
  @PersistenceContext
    private EntityManager em;
...
Рейтинг: 0 / 0
jpql как вернуть min max в одном запросе ?
    #39259065
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тест

Самый простой время исполнения на базе : 0.001 s



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    select
        e.id,
        e.name,
        e.salary,
        e.department_id,
        e.employee_id     
    from
        employee e      
    WHERE
        e.id = 2 



через createNativeQuery 0.07 s

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    @Test
    @Repeat(5)
    public void test4N() {

        final StopWatch stopWatch = new StopWatch();
        stopWatch.start("mployeeService.findOnlyId");
        Employee employee = employeeService.findOnlyId(2);
        stopWatch.stop();
        System.out.println(employee);
        System.out.println(stopWatch.prettyPrint());
    }



где

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
@Override
    @Transactional(readOnly = true ,propagation = Propagation.SUPPORTS)
    public Employee findOnlyId(Integer id) {

        String sql = " select \n"
                + "         e.id, \n"
                + "         e.name,\n"
                + "         e.salary,\n"
                + "         e.department_id,\n"
                + "         e.employee_id\n"
                + "    from\n"
                + "        employee e \n"
                + "\n"
                + "   WHERE e.id = :id";


        Object[] employee = (Object[]) em.createNativeQuery(sql)
                .setParameter("id", id)
                .getSingleResult();
      
        Employee e = new Employee(
                (Integer) employee[0],
                (String) employee[1],
                ((BigInteger) employee[2]).longValue(),
                (Integer) employee[3],
                (Integer) employee[4]);
        
        return e; 

       
    }



лучшее время 7 ms против 1 ms !!!

и Это нативный запрос у которого @Transactional(readOnly = true ,propagation = Propagation.SUPPORTS)

если делать обучный где все коллекции и поля LAZY - лучшее время 50 ms !!!
...
Рейтинг: 0 / 0
jpql как вернуть min max в одном запросе ?
    #39259071
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Hibernate: 
    select
        e.id,
        e.name,
        e.salary,
        e.department_id,
        e.employee_id     
    from
        employee e      
    WHERE
        e.id = ?
июн 20, 2016 5:27:12 PM org.hibernate.engine.internal.StatisticalLoggingSessionEventListener end
INFO: Session Metrics {
    4102790 nanoseconds spent acquiring 1 JDBC connections;
    0 nanoseconds spent releasing 0 JDBC connections;
    4275069 nanoseconds spent preparing 1 JDBC statements;
    203020 nanoseconds spent executing 1 JDBC statements;
    0 nanoseconds spent executing 0 JDBC batches;
    0 nanoseconds spent performing 0 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections);
    0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections)
}
Employee{id=2, name=Matyushkin, salary=19000000, departmentId=1, employeeId=1}
StopWatch '': running time (millis) = 9
-----------------------------------------
ms     %     Task name
-----------------------------------------
00009  100%  mployeeService.findOnlyId
...
Рейтинг: 0 / 0
jpql как вернуть min max в одном запросе ?
    #39259153
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[youtube=
YouTube Video
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / jpql как вернуть min max в одном запросе ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]