【问题标题】:How to get values from logs into java list? <hibernate>如何从日志中获取值到java列表中? <休眠>
【发布时间】:2020-01-19 17:09:14
【问题描述】:

是否可以从控制台获取该值: 并将它们保存到 java 列表/地图中?

我以这种方式打印了日志:

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

我的查询:

@Transactional
public String executeSQL(String[] split){
    SessionFactory hibernateFactory = someService.getHibernateFactory();
    String message = null;
    int rows = 0;
    EntityManager entityManager = hibernateFactory.createEntityManager();
    EntityTransaction utx = entityManager.getTransaction();
    for (int i = 0; i < split.length; i++) {
        String query = split[i];
        try {
            utx.begin();
            Query query1 = entityManager.createNativeQuery(query);
            rows = query1.executeUpdate();
            utx.commit();
            try{
                resultList = query1.getResultList();
                resultList.stream().map(Arrays::toString).forEach(System.out::println);
            }
            catch(Exception e){
            }
            message = "Success \n{ ["+rows+"] <--- affected rows}";
        }catch (PersistenceException e){
            utx.rollback();
            message = (((SQLGrammarException)e.getCause()).getSQLException()).getMessage();
        }
    }
    entityManager.close();
    return message;
}

如您所见,我知道如何将值保存到列表中,但我无法提取列...因为没有关于列名称的信息。在日志中,列有名称,列也有类型,这些信息对我很有用。

【问题讨论】:

  • 你能分享你剩下的代码吗?例如,缺少实际的本机查询。也看看这里:baeldung.com/hibernate-query-to-custom-class
  • 我编辑了代码。你是什​​么意思我的查询丢失了?
  • 我认为你没有理解 Hibernate 的目的。 Hibernate 是一个 ORM,这意味着它将 Java POJO 映射到数据库表中,反之亦然。您所指的信息是您的实体对象。

标签: java hibernate hibernate-mapping


【解决方案1】:

作为一个选项,如何实现它是Logback Appender 一旦您将日志记录到 appender,您就可以实现过滤以及您需要的任何内容。

1.增加对logback-classic的依赖

<dependency>
   <groupId>ch.qos.logback</groupId>
   <artifactId>logback-classic</artifactId>
   <version>1.2.3</version>
</dependency>

2.将logback.xml添加到资源中

<configuration>
    <appender name="list" class="com.test.ListAppender"/>
    <root level="info">
        <appender-ref ref="list"/>
    </root>
</configuration>

3.实现Appender类

package com.test;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;

import java.util.LinkedList;
import java.util.List;

public class ListAppender extends AppenderBase<ILoggingEvent> {

    private static List<ILoggingEvent> eventList = new LinkedList<>();

    @Override
    protected void append(ILoggingEvent event) {
        eventList.add(event);
    }

    public List<ILoggingEvent> getEventList() {
        return eventList;
    }
}

4.测试你的代码

package com.test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger logger = LoggerFactory.getLogger(Main.class);

    static ListAppender listAppender = new ListAppender();

    public static void main(String[] args) {
        logger.info("Hello World");
        listAppender.getEventList().forEach(entry -> System.out.println("print log from list:" + entry));
        System.out.println();
    }
}

【讨论】:

    猜你喜欢
    • 2011-10-05
    • 2020-05-21
    • 2018-10-19
    • 1970-01-01
    • 2015-01-15
    • 2011-11-06
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多