Collection sort

Sort collection using stream and Lambda functions.

				
					import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class Sorter1 {
	public static void main(String[] args) {
		List<Student> students = new ArrayList<>();
		students.add(new Student("A", 10));
		students.add(new Student("B", 12));
		students.add(new Student("C", 8));
		students.add(new Student("D", 9));
		students.add(new Student("E", 11));
		students.add(new Student("F", 14));
		
		System.out.println("=== Before Sort ============");
		students.forEach(i -> System.out.println(i.toString()));
		
		List<Student> list1 = students.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
				// OR
		List<Student> list1 = students.stream().sorted((a,b) -> a.getAge().compareTo(b.getAge())).collect(Collectors.toList());
		
		System.out.println("\n=== After Sort ============");
		list1.forEach(i -> System.out.println(i.toString()));
	}
}
				
			

Sort collection without stream.

				
					import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class Sorter1 {
	public static void main(String[] args) {
		List<Student> students = new ArrayList<>();
		students.add(new Student("A", 10));
		students.add(new Student("B", 12));
		students.add(new Student("C", 8));
		students.add(new Student("D", 9));
		students.add(new Student("E", 11));
		students.add(new Student("F", 14));
		
		System.out.println("=== Before Sort ============");
		students.forEach(i -> System.out.println(i.toString()));
		
		students.sort(Comparator.comparing(Student::getAge));
		// OR
		students.sort((a,b)->a.getAge().compareTo(b.getAge()));
		
		System.out.println("\n=== After Sort ============");
		students.forEach(i -> System.out.println(i.toString()));
	}
}
				
			
				
					class Student{
	private String name;
	private Integer age;
	
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public String toString() {
		return this.name+" : "+ this.age;
	}
	public String getName() {
		return name;
	}
	public Integer getAge() {
		return age;
	}
}

				
			
				
					=== Before Sort ============
A : 10
B : 12
C : 8
D : 9
E : 11
F : 14

=== After Sort ============
C : 8
D : 9
A : 10
E : 11
B : 12
F : 14
				
			

Invoke SQL script during servlet initialization



Here MyContextListener is a listener which implements ServletContextListener

				
					--- web.xml ---

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID">
	<display-name>proj2</display-name>
	
	<context-param>
		<param-name>createTables</param-name>
		<param-value>yes</param-value>
	</context-param>
	<listener>
		<listener-class>com.brains.MyContextListener</listener-class>
	</listener>
	<listener>
		<listener-class>com.brains.MySessionListener</listener-class>
	</listener>
	
	<servlet>
		<servlet-name>FirstServlet</servlet-name>
		<display-name>FirstServlet</display-name>
		<description></description>
		<servlet-class>brains.FirstServlet</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>Login</servlet-name>
		<display-name>Login</display-name>
		<description></description>
		<servlet-class>brains.Login</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>MyConfigDemo</servlet-name>
		<display-name>MyConfigDemo</display-name>
		<description></description>
		<servlet-class>brains.MyConfigDemo</servlet-class>
		<init-param>
			<param-name>driver</param-name>
			<param-value>com.mysql.jdbc.Driver</param-value>
			<description></description>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>FirstServlet</servlet-name>
		<url-pattern>/FirstServlet</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>Login</servlet-name>
		<url-pattern>/login</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>MyConfigDemo</servlet-name>
		<url-pattern>/MyConfigDemo</url-pattern>
	</servlet-mapping>
	<welcome-file-list>
		<welcome-file>login.html</welcome-file>
	</welcome-file-list>
</web-app>

				
			
				
					package com.brains;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import brains.DBInitializer;

public class MyContextListener implements ServletContextListener {
    public MyContextListener() {
    	System.out.println("MyContextListener constructor");
    }
    public void contextDestroyed(ServletContextEvent sce)  { 
    	System.out.println("Context destroyed");
    }
    public void contextInitialized(ServletContextEvent sce)  { 
    	System.out.println("Context initialized");
    	ServletContext servletContext = sce.getServletContext();
    	String param = servletContext.getInitParameter("createTables");
    	if(param.equals("yes")) {
    		String table = servletContext.getRealPath("WEB-INF/table/table.sql");
    		System.out.println("img: "+ table);
    		
    		DBInitializer db = new DBInitializer();
    		db.createTables(table);
    	}
    }
}

				
			
				
					package brains;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnection {

	public static Connection initialize() throws SQLException, ClassNotFoundException {
		String dbDriver = "com.mysql.cj.jdbc.Driver";
		String dbUrl = "jdbc:mysql://localhost:3307/";
		
		String dbName = "servlet-demo";
		String dbUsername = "root";
		String dbPassword = "root";
		
		Class.forName(dbDriver);
		Connection con = DriverManager.getConnection(dbUrl+dbName,dbUsername, dbPassword);
		return con;
	}
}

				
			
				
					package brains;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.Statement;
import java.util.StringTokenizer;

public class DBInitializer {

	public void createTables(String path) {
		try {
			FileInputStream in = new FileInputStream(path);
			byte data[] = new byte[in.available()];
			in.read(data);
			in.close();
			StringTokenizer str = new StringTokenizer(new String(data), "/");
			Connection con = DatabaseConnection.initialize();
			Statement stmt = con.createStatement();
			System.out.println("Creating tables...");
			while(str.hasMoreElements()) {
				String qr = str.nextToken();
				System.out.println(qr);
				if(qr.trim().equals("stop")) {
					break;
				}
				stmt.execute(qr);
			}
			System.out.println("tables successfully created.");
		}catch(Exception e) {
			System.out.println(e);
		}
	}
	
}

				
			
				
					package brains;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class FirstServlet
 */
public class FirstServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public FirstServlet() {
        super();
        // TODO Auto-generated constructor stub
        System.out.println("constructor");
    }

//	@Override
//	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		// TODO Auto-generated method stub
//		resp.getWriter().print("Servlet by http");
//	}

//	@Override
//	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//		// TODO Auto-generated method stub
//		res.getWriter().print("Servlet by original service");
//	}
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
		resp.getWriter().print("Servlet by doGet");
		
		ServletConfig config = this.getServletConfig();
		ServletContext context = this.getServletContext();
		
		ServletContext servletContext = config.getServletContext();
		System.out.println(config);
		System.out.println(context);
		System.out.println(servletContext);
		
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		PrintWriter writer = resp.getWriter();
		
		String name = req.getParameter("name");
		String email = req.getParameter("email");
		String mobile = req.getParameter("mobile");
		String password = req.getParameter("password");
		
		Connection con = null;
		try {
			con = DatabaseConnection.initialize();
			PreparedStatement psc = con.prepareStatement("insert into employee values(?,?,?,?)");
			psc.setString(1, name);
			psc.setString(2, email);
			psc.setString(3, mobile);
			psc.setString(4, password);
			
			int i = psc.executeUpdate();
			if(i > 0) {
				resp.sendRedirect("welcome.html");
			}else {
				writer.println("problem");
			}
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

				
			
				
					package brains;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyConfigDemo extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String dir = System.getProperty("user.dir");
		System.out.println("Dir: "+ dir);
		
//		String table = System.getProperty("user.dir")+"/table.sql";
		
		
		response.getWriter().println(this.getServletConfig());
		String name = (String) getServletContext().getAttribute("name");
		String password = (String) getServletContext().getAttribute("password");
		System.out.println("get: "+ name +":" + password);
		response.getWriter().println(name +" : "+password);
		
		
		ServletConfig config = this.getServletConfig();
		System.out.println(config);
		String driver = config.getInitParameter("driver");
		System.out.println("driver: "+ driver);
		
		ServletContext context = this.getServletContext();
		
		ServletContext servletContext = config.getServletContext();
		System.out.println(context);
		System.out.println(servletContext);
		
		String abcd = context.getInitParameter("abcd");
		System.out.println("abcd: "+ abcd);
		
		Enumeration<String> params = context.getInitParameterNames();
		while(params.hasMoreElements()) {
			String element = params.nextElement();
			System.out.println("element: "+ element +":"+context.getInitParameter(element));
		}
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		resp.getWriter().println(this.getServletConfig());
		
		String name = req.getParameter("name");
		String password = req.getParameter("password");
		System.out.println("post: "+ name +":" + password);
		resp.getWriter().println(name +" : "+password);
		
		
	}

}

				
			
				
					package brains;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class Login
 */
public class Login extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html");
		String name = request.getParameter("name");
		String password = request.getParameter("password");
		
		ServletContext servletContext = this.getServletContext();
		servletContext.setAttribute("name", name);
		servletContext.setAttribute("password", password);
		
		try {
			Connection conn = DatabaseConnection.initialize();
			PreparedStatement ps = conn.prepareStatement("select * from employee where name = ? and password = ?");
			ps.setString(1, name);
			ps.setString(2, password);
			
			ResultSet rs = ps.executeQuery();
			if(rs.next()) {
				
				HttpSession session = request.getSession();
				response.sendRedirect("MyConfigDemo");
			}else {
				response.getWriter().println("<span style='color:red'>404 error</span>");
				RequestDispatcher rd = request.getRequestDispatcher("login.html");
				rd.include(request, response);
			}
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

				
			
				
					CREATE TABLE employee (
    name varchar(255),
    email varchar(255),
    mobile varchar(255),
    password varchar(255)
)
/
CREATE TABLE persons (
    lastName varchar(255),
    firstName varchar(255),
    address varchar(255),
    city varchar(255)
)
				
			
				
					<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor="yellow">
<h2>Login here </h2>
<form action="login" method="post">
	<input type="text" placeholder="First name" name="name"/></br>
	<input type="text" placeholder="Password" name="password"/></br>
	<input type="submit" value="Login"/>
</form></br>
<a href="register.html">Register here</a>
</body>
</html>
				
			
				
					<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor="yellow">
It works
<form action="FirstServlet" method="post">
	<input type="text" placeholder="First name" name="name"></br>
	<input type="text" placeholder="Email" name="email"></br>
	<input type="text" placeholder="Mobile" name="mobile"></br>
	<input type="text" placeholder="Password" name="password"></br>
	<input type="submit">
</form></br>
<a href="login.html">Login here</a>
</body>
</html>
				
			
				
					<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>Welcome</h2>
</body>
</html>
				
			

Servlet basics

Servlet is created using these 3 methods:

  • extends HttpServlet
  • implement Servlet
  • extends GenericServlet
 
 
Container is available inside of the server.
Container is the runtime environment of any component. Servlets run inside the Container.
 
Servlet lifecycle methods
  • init
  • service
  • destroy
web.xml also called Deployment Descriptor

Forward the response and request to other servlets

				
					RequestDispatcher rd = request.getRequestDispatcher("MyConfigDemo");
				rd.forward(request, response);
				
			
Home folder
				
					String dir = System.getProperty("user.dir");
System.out.println("Dir: "+ dir);
//Dir: /home/soundarya
				
			

Docker Commands

MySQL docker

				
					> docker run --name docker-mysql -v /var/lib/mysql-lively-data:/var/lib/mysql -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=oplink456 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d -p:3306:3306 --net livelyhealth --restart always mysql:8 --default-authentication-plugin=mysql_native_password

> docker run --name docker-mysql -v /var/lib/mysql-lively-data:/var/lib/mysql -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=secret -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d -p:3306:3306 --restart always mysql:8 --default-authentication-plugin=mysql_native_password

> docker run --name docker-durgesh -v /var/lib/mysql-durgesh-data:/var/lib/mysql -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=secret -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d -p:3307:3306 --restart always mysql:8 --default-authentication-plugin=mysql_native_password
				
			

Mongo docker

				
					> docker run --name mongodb0 -v /data/mongodb0:/data/db -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=root --privileged=true -e MONGO_INITDB_ROOT_PASSWORD=root -d mongo --auth
> docker exec -it b654ee788e95 bash
> mongodb://root:root@127.0.0.1:27017/?authSource=admin
				
			

Postgres docker

				
					> docker run -d -p 5432:5432  \
      --restart always \
      --name some-postgres \
      -e POSTGRES_PASSWORD=mysecretpassword \
      -e PGDATA=/var/lib/postgresql/data/pgdata \
      -v ~/AWSMO/postgres-data:/var/lib/postgresql/data \
      postgres
				
			
				
					> docker run -d -p 5432:5432  \
      --restart always \
      --name some-postgres \
      -e POSTGRES_PASSWORD=mysecretpassword \
      -e PGDATA=/var/lib/postgresql/data/pgdata \
      -v /home/soundarya/temp/db-data/postgres/data1:/var/lib/postgresql/data \
      postgres
				
			

Remove all images with tag none

				
					docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
				
			

Remove all exited containers docker

				
					docker rm $(docker ps -a -f status=exited -q)
docker rm $(docker ps -a -q)
				
			

Find all images using wildcharacter search

				
					docker images --filter=reference='*hands*/*:*latest*'

REPOSITORY                           TAG       IMAGE ID       CREATED          SIZE
hands-on/product-composite-service   latest    319db4ad7810   15 minutes ago   337MB
hands-on/gateway                     latest    7dc5a3abb416   15 minutes ago   328MB
hands-on/config-server               latest    db7c7bceb7bc   15 minutes ago   309MB
				
			

Save docker images on other server using wild character

				
					docker images --filter=reference='*hands*/*:*latest*' | awk '{print $1 " " $2 " " $3 }' | while read REPOSITORY TAG IMAGE_ID
do
  echo "== Save image: $REPOSITORY"
  docker save "$REPOSITORY" | ssh -i ~/.ssh/multipass-k8s -C ubuntu@10.131.187.176 docker load
done
				
			
				
					## RabbitMQ docker

# --------------------

docker run --rm -it -d --hostname my-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management

http://localhost:15672/

credentials guest:guest

https://codeburst.io/get-started-with-rabbitmq-on-docker-4428d7f6e46b







## connect mysql in terminal

docker exec -it bcf53fb14786 bash

mysql --protocol=tcp -u root -p -P 3306

mysql -uroot -p -h 127.0.0.1

mysql -u root -p

 

GRANT ALL PRIVILEGES ON *.* TO 'user_name'@'%' IDENTIFIED BY "admin";

FLUSH PRIVILEGES;

 

## run docker local container

# -----------------------------------------------------------

#   Connect MySQL and Spring with separate docker containers

# -----------------------------------------------------------

 

# 1) build docker for backend

docker build -t longevity-backend .

 

# 2) create network to be used

docker network create livelyhealth

 

# 3) start mysql with network name

docker run --name docker-mysql -v /var/lib/mysql-lively-data:/var/lib/mysql -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=oplink456 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d -p:3306:3306 --net livelyhealth --restart always mysql:8 --default-authentication-plugin=mysql_native_password

 

# 4) start backend with network name

docker run -d -p 8080:8080 -t --net livelyhealth longevity-backend

 

# -----------------------------------------------------------

# E N D

# -----------------------------------------------------------







# -------- application.properties --------------

spring.datasource.url=jdbc:mysql://docker-mysq

l:3306/longevity

# -----------------------------------------------------------

docker network ls

docker network inspect livelyhealth

 

# once mysql docker starts, change the user/pwd

 

mysql -u homestead -p -h 127.0.0.1

 

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'oplink456';

ALTER USER 'homestead'@'%' IDENTIFIED WITH mysql_native_password BY 'secret';

FLUSH PRIVILEGES;

 

# use in compass

mongodb://admin:password@localhost:27017/tutorialmern?readPreference=primary&appname=MongoDB%20Compass&ssl=false

 

# use in code

mongodb://admin:password@localhost:27017/tutorialmern?authSource=admin







## if error with client comes while running

# ==============================

https://stackoverflow.com/questions/55763428/react-native-error-enospc-system-limit-for-number-of-file-watchers-reached

 

# insert the new value into the system config

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

 

# check that the new value was applied

cat /proc/sys/fs/inotify/max_user_watches

 

# config variable name (not runnable)

fs.inotify.max_user_watches=524288

# ==============================

 

# kill process of any port

kill $(lsof -t -i:3001)

sudo lsof -i -P -n | grep 3306

kill -9 $(lsof -t -i:3306)

 

# get folder size

du -h --max-depth=1







mongodb+srv://soundarya:<password>@cluster0.ny9zr.mongodb.net/myFirstDatabase?retryWrites=true&w=majority

 

DATABASE='mongodb+srv://soundarya:droisys@cluster0.ny9zr.mongodb.net/mernstack?retryWrites=true&w=majority';

DATABASE="mongodb://admin:password@localhost:27017/mernstack?authSource=admin"

XuH4tfjE6ZjZXC_xoG48wGaQlU1vcLGWk







# Shortcuts

ln -s /media/soundarya/h_drive/hdrive_data/ ~/hdrive_data

ln -s ~/hdrive_data/MERN/projects/mern_thapa_local/docker_info.md ~/Desktop/desktop_info.md

ln -s ~/hdrive_data/spring ~/spring

ln -s ~/hdrive_data/spring-durgesh ~/spring-learn

ln -s ~/hdrive_data/MERN ~/mern

ln -s ~/hdrive_data/Freedom_financial ~/ff

ln -s ~/hdrive_data/NodeJS ~/NodeJS

 

#encfs

encfs /mnt/h_drive/hdrive_data/temp/J1A /mnt/h_drive/hdrive_data/temp/J2 

fusermount -u /mnt/h_drive/hdrive_data/temp/J2 

sudo umount -l /mnt/h_drive/hdrive_data/temp/J2

 

#compress file

tar cfz bin.tgz bin

 

#uncompress tar.gz file

tar -xvzf file.tar.gz

 

#search

grep -rnw '/path/to/somewhere/' -e 'pattern'

 

#Timestream databases

https://www.g2.com/categories/time-series-databases

 

#InfluxDB

https://hub.docker.com/_/influxdb

 

$ docker run -p 8086:8086 \

      -v $PWD/data:/var/lib/influxdb2 \

      -v $PWD/config:/etc/influxdb2 \

      -v $PWD/scripts:/docker-entrypoint-initdb.d \

      -e DOCKER_INFLUXDB_INIT_MODE=setup \

      -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \

      -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \

      -e DOCKER_INFLUXDB_INIT_ORG=my-org \

      -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \

      -e V1_DB_NAME=v1-db \

      -e V1_RP_NAME=v1-rp \

      -e V1_AUTH_USERNAME=v1-user \

      -e V1_AUTH_PASSWORD=v1-password \

      influxdb:2.0

      

$ docker run -d -p 8086:8086 \

      --restart always \

      -v ~/AWSMO/InfluxDB-data/data:/var/lib/influxdb2 \

      -v ~/AWSMO/InfluxDB-data/config:/etc/influxdb2 \

      -v ~/AWSMO/InfluxDB-data/scripts:/docker-entrypoint-initdb.d \

      -e DOCKER_INFLUXDB_INIT_MODE=setup \

      -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \

      -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \

      -e DOCKER_INFLUXDB_INIT_ORG=my-org \

      -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \

      -e V1_DB_NAME=v1-db \

      -e V1_RP_NAME=v1-rp \

      -e V1_AUTH_USERNAME=v1-user \

      -e V1_AUTH_PASSWORD=v1-password \

      influxdb:2.1.1







influx config create --config-name influx-config \

  --host-url http://localhost:8086 \

  --org awsmo \

  --token PJ7zd8rw0ai7rOMnTUil_kIz2wlcOzVH9_qD4p_LYxehQS6Uyp6mJ3X9QQUjNAEIigvsMSdyKlvrd5lOLtANRA== \

  --active







3.216.123.152

postgres/awsmo@123

db: awsmodb







====

https://www.tutorialspoint.com/spring_boot/spring_boot_database_handling.htm

Restart Postgres server

----------------------------------

Postgres live

3.216.123.152

 

> cd /usr/pgsql-14/bin

> sudo su postgres

> bash-4.2$ ./pg_ctl restart -D /var/lib/pgsql/14/data

 

Find number of open connections

----------------------------------

> ps ax | grep post | wc -l

 

influx -username admin -password 'awsmo@12345'

 

influx config \

  --host-url http://localhost:8086 \

  --org my-org \

  --token z5XiyReADjf0W915EzfZVGlkGXwhdZjJjOCGVeFjr7iZZ8HTVXK15Z7zA5oySQdn303k6a-uozf2rP67GAo60g== \

  --active







influx query 'from(bucket:"my-bucket") |> range(start:-30d)'

 

https://techviewleo.com/how-to-install-influxdb-on-amazon-linux/

CREATE USER admin WITH PASSWORD 'awsmo@12345' WITH ALL PRIVILEGES

GRANT ALL PRIVILEGES TO admin

 

curl -G "http://localhost:8086/query?u=admin&p=AWSMO@Password" --data-urlencode "q=SHOW DATABASES"







#QuestDB

https://questdb.io/docs/get-started/docker/

 

docker run -p 9000:9000 \

 -p 9009:9009 \

 -p 8812:8812 \

 -p 9003:9003 \

 questdb/questdb







#open elementary code

io.elementary.code







Influxdb history:

================

Date: 22 Feb 2022

Exported Data: 14000 records, excel size: 3.8 mb

Influxdb Full Backup size: 1.3G

 
				
			

Git commands

				
					# create git repo

git init --bare ~/mern/project.git

 

# go to project, initialize the git

git init .

 

# add git remote to local repo

git remote add origin ~/mern/project.git

 

# complete the remaining git commands

git add .

git commit -m "msg"

git push

 

# connect git on local network

git remote add origin ssh://soundarya@192.168.1.6:/home/soundarya/spring-durgesh/Springboot-LSF.git

git branch --set-upstream-to=origin/master

 
				
			

Linux search

Search file by name

find . -iname “*abc.txt”

 

Search 'text' in any file

grep -rnw “/path/to/somewhere/” -e “pattern”


  • -r or -R is recursive,
  • -n is line number, and
  • -w stands for match the whole word.
  • -l (lower-case L) can be added to just give the file name of matching files.
  • -e is the pattern used during the search
Along with these, --exclude--include--exclude-dir flags could be used for efficient searching:
  • This will only search through those files which have .c or .h extensions:
    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
    
  • This will exclude searching all the files ending with .o extension:
    grep --exclude=\*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • For directories it’s possible to exclude one or more directories using the --exclude-dir parameter. For example, this will exclude the dirs dir1/dir2/ and all of them matching *.dst/:
grep –exclude-dir={dir1,dir2,*.dst} -rnw ‘/path/to/search/’ -e “pattern”

Reference:
https://stackoverflow.com/questions/16956810/how-to-find-all-files-containing-specific-text-string-on-linux

Set up personal SSH keys on Linux

				
					#=========================
#   ON CLIENT
#=========================

# Go to this location and create the private and public keys
cd ~/.ssh
ssh-keygen -t ed25519 -b 4096 -C "{username@emaildomain.com}" -f {ssh-key-name}

# This will create two files
{ssh-key-name} — the private key.
{ssh-key-name}.pub — the public key.

# start the agent
eval $(ssh-agent)

# Invoke this command to add the keys in config
ssh-add ~/.ssh/{ssh-key-name}

# Ensure correct ssh key is configured, and add ip and key location
vim ~/.ssh/config

Host 10.21.172.143
  AddKeysToAgent yes
  IdentityFile ~/.ssh/{ssh-key-name}


#=========================
#   ON SERVER
#=========================

# Go to this location
cd ~/.ssh

# Paste the public key in the "authorize_keys" file
authorized_keys
				
			

Install OpenSSH on Linux

 
 

To install OpenSSH, we recommend using the OpenSSH package provided by your Linux distribution.

  • For Debian, Ubuntu, Linux Mint, and other Debian-based distributions:

    1 sudo apt update && sudo apt install openssh-client
  • For Fedora, CentOS, Red Hat Enterprise Linux, Oracle Linux, and other Fedora-based distributions:

    1 sudo dnf install openssh-clients
  • For Arch Linux and other Arch Linux-based distributions:

    1 sudo pacman -Sy openssh
  • For SUSE Linux, openSUSE Linux, and other SUSE-based distributions:

    1 sudo zypper install openssh
 
 

In the terminal, check that OpenSSH has been successfully installed by running the following command:

1 ssh -V

The output should show the installed version of OpenSSH.

Start the SSH agent

 
 

To allow git to use your SSH key, an SSH agent needs to be running on your device.

To check if it is already running, run the ps command. If the ssh-agent is already running, it should appear in the output, such as:

1 2 $ ps -auxc | grep ssh-agent myusername 3291 0.0 0.0 6028 464 ? Ss 07:29 0:00 ssh-agent

To start the agent, run:

1 eval $(ssh-agent)

You may need to add this command to your ~/.bashrc, ~/.zshrc, ~/.profile, or equivalent shell configuration file. Adding this command to a shell configuration file will ensure the agent is running when you open a terminal.

Create an SSH key pair

 
 

To create an SSH key pair:

  1. Open a terminal and navigate to your home or user directory using cd, for example:

    1 cd ~
  2. Generate a SSH key pair using ssh-keygen, such as:

    1 ssh-keygen -t ed25519 -b 4096 -C "{username@emaildomain.com}" -f {ssh-key-name}

    Where:

    • {username@emaildomain.com} is the email address associated with the Bitbucket Cloud account, such as your work email account.

    • {ssh-key-name} is the output filename for the keys. We recommend using a identifiable name such as bitbucket_work.

  3. When prompted to Enter passphrase, you can either provide a password or leave the password empty. If you input a password, you will be prompted for this password each time SSH is used, such as using Git command that contact Bitbucket Cloud (such as git push, git pull, and git fetch). Providing a password will prevent other users with access to the device from using your keys.

Once complete, ssh-keygen will output two files:

  • {ssh-key-name} — the private key.

  • {ssh-key-name}.pub — the public key.

Add your key to the SSH agent

 
 

To add the SSH key to your SSH agent (ssh-agent):

  1. Run the following command, replacing the {ssh-key-name} with the name of the private key:

    1 ssh-add ~/{ssh-key-name}
  2. To ensure the correct SSH key is used when connecting to Bitbucket, update or create your SSH configuration file (~/.ssh/config) with the following settings:

    1 2 3 Host bitbucket.org AddKeysToAgent yes IdentityFile ~/.ssh/{ssh-key-name}

    Where {ssh-key-name} is the location of the private key file once it has been added to the ssh-agent.

Provide Bitbucket Cloud with your public key

 
 

To add an SSH key to your user account:

  1. At bitbucket.org, select your avatar (Your profile and settings) from the navigation bar at the top of the screen.

  2. Under Settings, select Personal settings.

  3. Under Security, select SSH keys.

  4. Select Add key.

  5. In the Add SSH key dialog, provide a Label to help you identify which key you are adding. For example, Work Laptop <Manufacturer> <Model>. A meaning full label will help you identify old or unwanted keys in the future.

  6. Open the public SSH key file (public keys have the .pub file extension) in a text editor. The public key should be in the .ssh/ directory of your user (or home) directory. The contents will be similar to:

    1 ssh-ed25529 LLoWYaPswHzVqQ7L7B07LzIJbntgmHqrE40t17nGXL71QX9IoFGKYoF5pJKUMvR+DZotTm user@example.com
  7. Copy the contents of the public key file and paste the key into the Key field of the Add SSH key dialog.

  8. Select Add key.

    • If the key is added successfully, the dialog will close and the key will be listed on the SSH keys page.

    • If you receive the error That SSH key is invalid, check that you copied the entire contents of the public key (.pub file).

Check that your SSH authentication works

 
 

To test that the SSH key was added successfully, open a terminal on your device and run the following command:

1 ssh -T git@bitbucket.org

If SSH can successfully connect with Bitbucket using your SSH keys, the command will produce output similar to:

1 2 3 authenticated via ssh key. You can use git to connect to Bitbucket. Shell access is disabled
 

Reference:

https://support.atlassian.com/bitbucket-cloud/docs/set-up-personal-ssh-keys-on-linux/

Criteria Query with Join

Using Join with Criteria queries

				
					insert into course(id, name, created_date, last_updated_date) 
values(10001, 'JPA in 5 Steps', LOCALTIMESTAMP, LOCALTIMESTAMP);
insert into course(id, name, created_date, last_updated_date) 
values(10002, 'JDBC in 100 Steps', LOCALTIMESTAMP, LOCALTIMESTAMP);
insert into course(id, name, created_date, last_updated_date) 
values(10003, 'JPQL in 50 Steps', LOCALTIMESTAMP, LOCALTIMESTAMP);

insert into passport(id, number)
values(40001,'E12345');
insert into passport(id, number)
values(40002,'F212345');
insert into passport(id, number)
values(40003,'GE23451');

insert into student(id, name, passport_id)
values(20001,'Ranga',40001);
insert into student(id, name, passport_id)
values(20002,'Adam',40002);
insert into student(id, name, passport_id)
values(20003,'Jane',40003);

insert into review(id, rating, description, course_id)
values(50001,'1', 'Great course', 10001);
insert into review(id, rating, description, course_id)
values(50002,'3', 'Nice course', 10001);
insert into review(id, rating, description, course_id)
values(50004,'5', 'Good you are writing', 10003);

insert into student_course(student_id, course_id)
values(20001, 10001);
insert into student_course(student_id, course_id)
values(20002, 10001);
insert into student_course(student_id, course_id)
values(20003, 10001);
insert into student_course(student_id, course_id)
values(20001, 10003);



				
			
				
					package com.brains.jpa.hibernate.jpahibernatedemo.entity;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.OneToMany;
import lombok.AccessLevel;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

@Entity
@Data
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Course {
	
	@Id
	@GeneratedValue
	private Long id;
	
	@NonNull
	private String name;
	
	@Setter(AccessLevel.NONE)
	@OneToMany(mappedBy = "course", fetch = FetchType.LAZY)
	private List<Review> reviews = new ArrayList<>();
	
	@ManyToMany(mappedBy = "courses")
	@Setter(value = AccessLevel.NONE)
	private List<Student> students = new ArrayList<>();
	
	public void addStudent(Student student) {
		this.students.add(student);
	}
	
	public void addReview(Review review) {
		this.reviews.add(review);
	}
	
	public void removeReview(Review review) {
		this.reviews.remove(review);
	}
	
	@UpdateTimestamp
	private LocalDateTime lastUpdatedDate;

	@CreationTimestamp
	private LocalDateTime createdDate;
	
	public Course(String name) {
		this.name = name;
	}
}

				
			
				
					package com.brains.jpa.hibernate.jpahibernatedemo.entity;

import java.util.ArrayList;
import java.util.List;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.OneToOne;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Entity
@Data @NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@RequiredArgsConstructor
public class Student {

	@Id
	@GeneratedValue
	private Long id;
	
	@NonNull
	@Column(nullable = false)
	private String name;
	
	@OneToOne(fetch = FetchType.LAZY)
	private Passport passport;
	
	@ToString.Exclude
	@ManyToMany
	@Setter(value = AccessLevel.NONE)
	@JoinTable(name = "STUDENT_COURSE", 
			joinColumns = @JoinColumn(name = "STUDENT_ID"),
			inverseJoinColumns = @JoinColumn(name = "COURSE_ID")
			)
	private List<Course> courses = new ArrayList<>();
	
	public void addCourse(Course course) {
		this.courses.add(course);
	}
}
				
			
				
					package com.brains.jpa.hibernate.jpahibernatedemo.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.OneToOne;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.ToString;

@Entity
@Data @NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@RequiredArgsConstructor
public class Passport {

	@Id
	@GeneratedValue
	private Long id;
	
	@NonNull
	@Column(nullable = false)
	private String number;
	
	@ToString.Exclude
	@OneToOne(fetch = FetchType.LAZY, mappedBy = "passport")
	private Student student;
}
				
			
				
					package com.brains.jpa.hibernate.jpahibernatedemo;

import java.util.List;

import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.brains.jpa.hibernate.jpahibernatedemo.entity.Course;

import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Join;
import jakarta.persistence.criteria.JoinType;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import jakarta.transaction.Transactional;

@SpringBootTest(classes = JpaHibernateDemoApplication.class)
class CriteriaJoinQueryTest {

	private Logger logger = LoggerFactory.getLogger(getClass());
	
	@Autowired
	EntityManager em;
	
	@Test
	@Transactional
	void join() {
		//"Select * From Course c join c.students s"
		// 1. Use Criteria builder to create CriteriaQuery returning the expected result
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<Course> cq = cb.createQuery(Course.class);
		
		// 2. Define root for the tables which are involved in the query
		Root<Course> courseRoot = cq.from(Course.class); // 'From Course c' part of main query
		
		// 3. Define Predicates for adding conditions
		Join<Object, Object> join = courseRoot.join("students");

		// 4. Add predicate to criteria query
		
		// 5. Build the typed query using entity manager and criteria query
		TypedQuery<Course> query = em.createQuery(cq.select(courseRoot));
		List<Course> resultList = query.getResultList();
		logger.info("join");
		logger.info("Size: -> {}", resultList.size());
		logger.info("Courses: -> {}", resultList);
	}
	
	@Test
	@Transactional
	void left_join() {
		//"Select * From Course c left join c.students s"
		// 1. Use Criteria builder to create CriteriaQuery returning the expected result
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<Course> cq = cb.createQuery(Course.class);
		
		// 2. Define root for the tables which are involved in the query
		Root<Course> courseRoot = cq.from(Course.class); // 'From Course c' part of main query
		
		// 3. Define Predicates for adding conditions
		Join<Object, Object> join = courseRoot.join("students", JoinType.LEFT);

		// 4. Add predicate to criteria query
		
		// 5. Build the typed query using entity manager and criteria query
		TypedQuery<Course> query = em.createQuery(cq.select(courseRoot));
		List<Course> resultList = query.getResultList();
		logger.info("left_join");
		logger.info("Size: -> {}", resultList.size());
		logger.info("Courses: -> {}", resultList);
	}
}

				
			
				
					2023-03-06T18:29:25.574+05:30  INFO 81680 --- [           main] c.b.j.h.j.CriteriaJoinQueryTest          : join
2023-03-06T18:29:25.574+05:30  INFO 81680 --- [           main] c.b.j.h.j.CriteriaJoinQueryTest          : Size: -> 2
2023-03-06T18:29:25.574+05:30  INFO 81680 --- [           main] c.b.j.h.j.CriteriaJoinQueryTest          : Courses: -> [Course(id=10001, name=JPA in 5 Steps, reviews=[Review(id=50001, rating=1, description=Great course), Review(id=50002, rating=3, description=Nice course)], students=[Student(id=20001, name=Ranga, passport=Passport(id=40001, number=E12345)), Student(id=20002, name=Adam, passport=Passport(id=40002, number=F212345)), Student(id=20003, name=Jane, passport=Passport(id=40003, number=GE23451))], lastUpdatedDate=2023-03-06T18:29:25.317624, createdDate=2023-03-06T18:29:25.317624), Course(id=10003, name=JPQL in 50 Steps, reviews=[Review(id=50004, rating=5, description=Good you are writing)], students=[Student(id=20001, name=Ranga, passport=Passport(id=40001, number=E12345))], lastUpdatedDate=2023-03-06T18:29:25.319045, createdDate=2023-03-06T18:29:25.319045)]
2023-03-06T18:29:25.608+05:30  INFO 81680 --- [           main] c.b.j.h.j.CriteriaJoinQueryTest          : left_join
2023-03-06T18:29:25.608+05:30  INFO 81680 --- [           main] c.b.j.h.j.CriteriaJoinQueryTest          : Size: -> 3
2023-03-06T18:29:25.608+05:30  INFO 81680 --- [           main] c.b.j.h.j.CriteriaJoinQueryTest          : Courses: -> [Course(id=10001, name=JPA in 5 Steps, reviews=[Review(id=50001, rating=1, description=Great course), Review(id=50002, rating=3, description=Nice course)], students=[Student(id=20001, name=Ranga, passport=Passport(id=40001, number=E12345)), Student(id=20002, name=Adam, passport=Passport(id=40002, number=F212345)), Student(id=20003, name=Jane, passport=Passport(id=40003, number=GE23451))], lastUpdatedDate=2023-03-06T18:29:25.317624, createdDate=2023-03-06T18:29:25.317624), Course(id=10002, name=JDBC in 100 Steps, reviews=[], students=[], lastUpdatedDate=2023-03-06T18:29:25.318861, createdDate=2023-03-06T18:29:25.318861), Course(id=10003, name=JPQL in 50 Steps, reviews=[Review(id=50004, rating=5, description=Good you are writing)], students=[Student(id=20001, name=Ranga, passport=Passport(id=40001, number=E12345))], lastUpdatedDate=2023-03-06T18:29:25.319045, createdDate=2023-03-06T18:29:25.319045)]

				
			

Related Tutorials

Criteria Queries

Use of Criteria queries instead of writing the SQL queries

				
					insert into course(id, name, created_date, last_updated_date) 
values(10001, 'JPA in 5 Steps', LOCALTIMESTAMP, LOCALTIMESTAMP);
insert into course(id, name, created_date, last_updated_date) 
values(10002, 'JDBC in 100 Steps', LOCALTIMESTAMP, LOCALTIMESTAMP);
insert into course(id, name, created_date, last_updated_date) 
values(10003, 'JPQL in 50 Steps', LOCALTIMESTAMP, LOCALTIMESTAMP);

insert into passport(id, number)
values(40001,'E12345');
insert into passport(id, number)
values(40002,'F212345');
insert into passport(id, number)
values(40003,'GE23451');

insert into student(id, name, passport_id)
values(20001,'Ranga',40001);
insert into student(id, name, passport_id)
values(20002,'Adam',40002);
insert into student(id, name, passport_id)
values(20003,'Jane',40003);

insert into review(id, rating, description, course_id)
values(50001,'1', 'Great course', 10001);
insert into review(id, rating, description, course_id)
values(50002,'3', 'Nice course', 10001);
insert into review(id, rating, description, course_id)
values(50004,'5', 'Good you are writing', 10003);

insert into student_course(student_id, course_id)
values(20001, 10001);
insert into student_course(student_id, course_id)
values(20002, 10001);
insert into student_course(student_id, course_id)
values(20003, 10001);
insert into student_course(student_id, course_id)
values(20001, 10003);



				
			
				
					package com.brains.jpa.hibernate.jpahibernatedemo.entity;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.OneToMany;
import lombok.AccessLevel;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

@Entity
@Data
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Course {
	
	@Id
	@GeneratedValue
	private Long id;
	
	@NonNull
	private String name;
	
	@Setter(AccessLevel.NONE)
	@OneToMany(mappedBy = "course", fetch = FetchType.LAZY)
	private List<Review> reviews = new ArrayList<>();
	
	@ManyToMany(mappedBy = "courses")
	@Setter(value = AccessLevel.NONE)
	private List<Student> students = new ArrayList<>();
	
	public void addStudent(Student student) {
		this.students.add(student);
	}
	
	public void addReview(Review review) {
		this.reviews.add(review);
	}
	
	public void removeReview(Review review) {
		this.reviews.remove(review);
	}
	
	@UpdateTimestamp
	private LocalDateTime lastUpdatedDate;

	@CreationTimestamp
	private LocalDateTime createdDate;
	
	public Course(String name) {
		this.name = name;
	}
}

				
			
				
					package com.brains.jpa.hibernate.jpahibernatedemo;

import java.util.List;

import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.brains.jpa.hibernate.jpahibernatedemo.entity.Course;

import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import jakarta.transaction.Transactional;

@SpringBootTest(classes = JpaHibernateDemoApplication.class)
class CriteriaQueryTest {

	private Logger logger = LoggerFactory.getLogger(getClass());
	
	@Autowired
	EntityManager em;
	
	@Test
	@Transactional
	void criteria_query_get_all_courses() {
		//"Select * From Course c"
		// 1. Use Criteria builder to create CriteriaQuery returning the expected result
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<Course> cq = cb.createQuery(Course.class);
		
		// 2. Define root for the tables which are involved in the query
		Root<Course> courseRoot = cq.from(Course.class); // 'From Course c' part of main query
		
		// 3. Define Predicates for adding conditions
		
//		TypedQuery<Course> createQuery = em.createQuery("select c from Course c", Course.class);
		TypedQuery<Course> createQuery = em.createQuery(cq.select(courseRoot));
		List<Course> resultList = createQuery.getResultList();
		logger.info("criteria_query_get_all_courses");
		logger.info("Size: -> {}", resultList.size());
		logger.info("Courses: -> {}", resultList);
	}
	
	@Test
	@Transactional
	void criteria_query_all_courses_with_100Steps() {
		//"Select * From Course c where name like '%100 Steps%'"
		// 1. Use Criteria builder to create CriteriaQuery returning the expected result
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<Course> cq = cb.createQuery(Course.class);
		
		// 2. Define root for the tables which are involved in the query
		Root<Course> courseRoot = cq.from(Course.class); // 'From Course c' part of main query
		
		// 3. Define Predicates for adding conditions
		Predicate like100Steps = cb.like(courseRoot.get("name"), "%100 Steps"); // 'like '%100' part of main query
		
		// 4. Add predicate to criteria query
		cq.where(like100Steps); // 'where' part of main query
		
//		TypedQuery<Course> createQuery = em.createQuery("select c from Course c", Course.class);
		TypedQuery<Course> createQuery = em.createQuery(cq.select(courseRoot));
		List<Course> resultList = createQuery.getResultList();
		logger.info("criteria_query_all_courses_with_100Steps");
		logger.info("Size: -> {}", resultList.size());
		logger.info("Courses: -> {}", resultList);
	}
	
	@Test
	@Transactional
	void all_courses_without_students() {
		// "Select * from Course c where c.students is empty"
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<Course> cq = cb.createQuery(Course.class);
		Root<Course> courseRoot = cq.from(Course.class);
		
		Predicate emptyStudents = cb.isEmpty(courseRoot.get("students"));
		cq.where(emptyStudents);
		TypedQuery<Course> query = em.createQuery(cq.select(courseRoot));
		List<Course> resultList = query.getResultList();
		
		logger.info("all_courses_without_students");
		logger.info("Size: -> {}", resultList.size());
		logger.info("Courses: -> {}", resultList);
	}
}

				
			
				
					2023-03-06T17:14:20.343+05:30  INFO 69425 --- [           main] c.b.j.h.j.CriteriaQueryTest              : criteria_query_get_all_courses
2023-03-06T17:14:20.344+05:30  INFO 69425 --- [           main] c.b.j.h.j.CriteriaQueryTest              : Size: -> 3
2023-03-06T17:14:20.344+05:30  INFO 69425 --- [           main] c.b.j.h.j.CriteriaQueryTest              : Courses: -> [Course(id=10001, name=JPA in 5 Steps, reviews=[Review(id=50001, rating=1, description=Great course), Review(id=50002, rating=3, description=Nice course)], students=[Student(id=20001, name=Ranga, passport=Passport(id=40001, number=E12345)), Student(id=20002, name=Adam, passport=Passport(id=40002, number=F212345)), Student(id=20003, name=Jane, passport=Passport(id=40003, number=GE23451))], lastUpdatedDate=2023-03-06T17:14:19.983050, createdDate=2023-03-06T17:14:19.983050), Course(id=10002, name=JDBC in 100 Steps, reviews=[], students=[], lastUpdatedDate=2023-03-06T17:14:19.984303, createdDate=2023-03-06T17:14:19.984303), Course(id=10003, name=JPQL in 50 Steps, reviews=[Review(id=50004, rating=5, description=Good you are writing)], students=[Student(id=20001, name=Ranga, passport=Passport(id=40001, number=E12345))], lastUpdatedDate=2023-03-06T17:14:19.984514, createdDate=2023-03-06T17:14:19.984514)]

				
			
				
					2023-03-06T17:14:20.313+05:30  INFO 69425 --- [           main] c.b.j.h.j.CriteriaQueryTest              : criteria_query_all_courses_with_100Steps
2023-03-06T17:14:20.313+05:30  INFO 69425 --- [           main] c.b.j.h.j.CriteriaQueryTest              : Size: -> 1
2023-03-06T17:14:20.313+05:30  INFO 69425 --- [           main] c.b.j.h.j.CriteriaQueryTest              : Courses: -> [Course(id=10002, name=JDBC in 100 Steps, reviews=[], students=[], lastUpdatedDate=2023-03-06T17:14:19.984303, createdDate=2023-03-06T17:14:19.984303)]

				
			
				
					2023-03-06T17:37:24.958+05:30  INFO 73453 --- [           main] c.b.j.h.j.CriteriaQueryTest              : all_courses_without_students
2023-03-06T17:37:24.958+05:30  INFO 73453 --- [           main] c.b.j.h.j.CriteriaQueryTest              : Size: -> 1
2023-03-06T17:37:24.958+05:30  INFO 73453 --- [           main] c.b.j.h.j.CriteriaQueryTest              : Courses: -> [Course(id=10002, name=JDBC in 100 Steps, reviews=[], students=[], lastUpdatedDate=2023-03-06T17:37:24.683421, createdDate=2023-03-06T17:37:24.683421)]

				
			

Related Tutorials