JPQL with left outer join

To remind my self!
@OneToOne @JoinColumn(name = "pk_column_name_in_main_table", referencedColumnName = "column_name_in_depeding_table", insertable = false, updatable = false) public Description getDescription() { return this.description; }

@Column(name = " column_name_in_depeding_table", nullable = true)
public int getDescriptionId() { return descriptionId; }
@Column(name ="language) Public String getLanguage(){return language;}

Now if I want something like

Select * from main m join depending d on m.pk_column_in_main_table = d.column_name_in_depending_table where d.column_name_in_depending_table is null

You have to put the where-criteria directly into the „left join“ condition of the jqpl query. If you do it like in SQL and put it in the where-clause, JPA (or at least Eclipselink, haven’t tried Hibernate) creates and „old-style“ (ANSI-89) style query, where the join condition is put in the where-clause and you won’t get any results!

@NamedQueries({ @NamedQuery(name = Main.FIND_BY_ID, query = "SELECT c FROM Main c left join c.description des on des.language = :language where = :id")}

Install Influx 1.7. on Raspian Stretch

As I have the latest zwave version 3.0 running, which only is supported by Raspian Strecth, the default InfluxDB that gets installed is version 1.0.2 and not the latest (1.7.x as of 8/2019). In order to get the correct version on your Raspberry, do the following
1. Add „deb stretch stable“ to „/etc/apt/sources.list.d/influxdb.list“ 2. sudo apt-get update 3. sudo apt-get install influxdb 4. systemctl unmask influxdb.service 5. Enable Influx on boot: sudo systemctl enable influxdb 6. sudo systemctl start influxdb 

Set up a embedded Payara 5 for Arquillian tests with DB2 z/OS drivers

Despite a lot of tutorials on using embedded Payara with Arquillian, I struggled a while to get the container running. Here are the steps

Code for configuring and deploying the embedded container

@Deployment public static Archive createDeployment() throws IOException {
File[] files = Maven.configureResolver().withMavenCentralRepo(false).loadPomFromFile("pom.xml").resolve("", "").withTransitivity().asFile();
final WebArchive war = ShrinkWrap.create(WebArchive.class, "test.war").addPackages(true, "").addPackages(true, "").addAsResource("persistence.xml", "META-INF/persistence.xml").addAsLibraries(files); // add all xml required for the queries
Files.walk(Paths.get("src/main/resources/META-INF")).forEach(file - >{
if (file.toFile().isFile() && !file.getFileName().toString().equalsIgnoreCase("MANIFEST.MF") && !file.getFileName().toString().equalsIgnoreCase("persistence.xml")) {
final String fileName = file.toAbsolutePath().toString();
final int start = fileName.indexOf("META-INF");
final String resource = fileName.substring(start - 1);
war.addAsResource(file.toFile(), resource);
return war;

Mind to put the arquillian.xml under „src/test/resources“

Maven dependencies:
org.jboss.arquillian.junit arquillian-junit-container 1.4.1.Final test
org.jboss.shrinkwrap.resolver shrinkwrap-resolver-impl-maven 2.2.6 test
junit junit 4.12 test
fish.payara.arquillian arquillian-payara-server-4-embedded 1.0.Beta3 test

Building a CalDAV client with web components

Some steps and pitfalls on my way creating a CalDAV client with webcomponents
1. If you want to use moment.js include it this way
import moment from ‚moment‘; window.moment = moment; 
2. The template for the „REPORT“ request should look like this, e.g. to get the events for a time range. Mind, there MUST NOT BE any whitespace between the backtick and the start of the xml declaration.
const query = (start,end) => `                                             `;
3. I had to start Chrome like this to get rid of CORS issues
open -a Google Chrome –args –disable-web-security –user-data-dir=„“
4. The fetch request should look like this
  let start = moment().subtract(5,’days‘);         let end = moment();         let startString =  start.format(„YYYYMMDD[T]000000[Z]“);         let endString = end.format(„YYYYMMDD[T]000000[Z]“);         let myHeaders = new Headers();         myHeaders.append(„DEPTH“,“1″);         myHeaders.append(„Authorization“,“Basic “ + authentication);
        console.log(‚caldaving‘, startString,endString)
        fetch(url,{             method: „REPORT“,             headers : myHeaders,             body : query(startString,endString)         })         .then(response => {             console.log(„reso“, response)             let xml = response.text();             console.log(‚Got appointments‘, xml);             return xml;         }).then(xml => console.log(‚xml‘,xml))
5. To get the authentication as base64 use „ echo -n user:password | base64“ Mind the „-n“ otherwise you get a line break at the end!